aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/parse.c18
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;