diff options
-rw-r--r-- | src/parse.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/parse.c b/src/parse.c index 4b938bb..a294898 100644 --- a/src/parse.c +++ b/src/parse.c @@ -983,15 +983,27 @@ parse_type(struct lexer *lexer, struct type *out) case T_STAR: out->kind = TYP_POINTER; out->desc.inner = must_malloc(sizeof(struct type)); - return parse_type(lexer, out->desc.inner); + + if (!parse_type(lexer, out->desc.inner)) { + error(lex_loc(lexer), "syntax error: expected type"); + } + return true; case T_QUESTION: out->kind = TYP_OPTIONAL; out->desc.inner = must_malloc(sizeof(struct type)); - return parse_type(lexer, out->desc.inner); + + if (!parse_type(lexer, out->desc.inner)) { + error(lex_loc(lexer), "syntax error: expected type"); + } + return true; case T_BANG: out->kind = TYP_FALLIBLE; out->desc.inner = must_malloc(sizeof(struct type)); - return parse_type(lexer, out->desc.inner); + + if (!parse_type(lexer, out->desc.inner)) { + error(lex_loc(lexer), "syntax error: expected type"); + } + return true; case T_BOOL: out->kind = TYP_BOOL; return true; |