From eab23cd5b74b9df2f5158138510b45c83bbf1bc8 Mon Sep 17 00:00:00 2001 From: Ginger Bill Date: Wed, 19 Jul 2017 22:34:50 +0100 Subject: [PATCH] Fix parsing bug with procedure types in return values --- src/parser.cpp | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index 0fbe160cb..48169f4d6 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -2295,28 +2295,30 @@ AstNode *parse_operand(AstFile *f, bool lhs) { if (allow_token(f, Token_Undef)) { return ast_proc_lit(f, type, nullptr, tags, link_name); - } else if (f->curr_token.kind == Token_OpenBrace) { - if ((tags & ProcTag_foreign) != 0) { - syntax_error(token, "A procedure tagged as `#foreign` cannot have a body"); - } - AstNode *curr_proc = f->curr_proc; - AstNode *body = nullptr; - f->curr_proc = type; - body = parse_body(f); - f->curr_proc = curr_proc; + } else if (!f->allow_type || f->expr_level >= 0) { + if (f->curr_token.kind == Token_OpenBrace) { + if ((tags & ProcTag_foreign) != 0) { + syntax_error(token, "A procedure tagged as `#foreign` cannot have a body"); + } + AstNode *curr_proc = f->curr_proc; + AstNode *body = nullptr; + f->curr_proc = type; + body = parse_body(f); + f->curr_proc = curr_proc; - return ast_proc_lit(f, type, body, tags, link_name); - } else if (allow_token(f, Token_do)) { - if ((tags & ProcTag_foreign) != 0) { - syntax_error(token, "A procedure tagged as `#foreign` cannot have a body"); - } - AstNode *curr_proc = f->curr_proc; - AstNode *body = nullptr; - f->curr_proc = type; - body = convert_stmt_to_body(f, parse_stmt(f)); - f->curr_proc = curr_proc; + return ast_proc_lit(f, type, body, tags, link_name); + } else if (allow_token(f, Token_do)) { + if ((tags & ProcTag_foreign) != 0) { + syntax_error(token, "A procedure tagged as `#foreign` cannot have a body"); + } + AstNode *curr_proc = f->curr_proc; + AstNode *body = nullptr; + f->curr_proc = type; + body = convert_stmt_to_body(f, parse_stmt(f)); + f->curr_proc = curr_proc; - return ast_proc_lit(f, type, body, tags, link_name); + return ast_proc_lit(f, type, body, tags, link_name); + } } if ((tags & ProcTag_foreign) != 0) {