aboutsummaryrefslogtreecommitdiff
path: root/src/parser.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-05-31 20:54:09 +0100
committergingerBill <bill@gingerbill.org>2021-05-31 20:54:09 +0100
commit673134185ab855703814732303c771def6c0c89d (patch)
treebdad3f7f5d33443c9aff03244194462946823cf3 /src/parser.cpp
parent3bf00e6125734de653d7b25202c14058b16c066f (diff)
Fix #996
Diffstat (limited to 'src/parser.cpp')
-rw-r--r--src/parser.cpp20
1 files changed, 11 insertions, 9 deletions
diff --git a/src/parser.cpp b/src/parser.cpp
index a5180b4dd..88f8ebb99 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -3786,7 +3786,8 @@ Ast *parse_if_stmt(AstFile *f) {
}
skip_possible_newline_for_literal(f);
- if (allow_token(f, Token_else)) {
+ if (f->curr_token.kind == Token_else) {
+ Token else_token = expect_token(f, Token_else);
switch (f->curr_token.kind) {
case Token_if:
else_stmt = parse_if_stmt(f);
@@ -3795,12 +3796,12 @@ Ast *parse_if_stmt(AstFile *f) {
else_stmt = parse_block_stmt(f, false);
break;
case Token_do: {
- Token arrow = expect_token(f, Token_do);
+ expect_token(f, Token_do);
else_stmt = convert_stmt_to_body(f, parse_stmt(f));
if (build_context.disallow_do) {
syntax_error(else_stmt, "'do' has been disallowed");
- } else if (!ast_on_same_line(cond, body)) {
- syntax_error(body, "The body of a 'do' be on the same line as 'else'");
+ } else if (!ast_on_same_line(else_stmt, else_stmt)) {
+ syntax_error(else_stmt, "The body of a 'do' be on the same line as 'else'");
}
} break;
default:
@@ -3842,7 +3843,8 @@ Ast *parse_when_stmt(AstFile *f) {
}
skip_possible_newline_for_literal(f);
- if (allow_token(f, Token_else)) {
+ if (f->curr_token.kind == Token_else) {
+ Token else_token = expect_token(f, Token_else);
switch (f->curr_token.kind) {
case Token_when:
else_stmt = parse_when_stmt(f);
@@ -3851,12 +3853,12 @@ Ast *parse_when_stmt(AstFile *f) {
else_stmt = parse_block_stmt(f, true);
break;
case Token_do: {
- Token arrow = expect_token(f, Token_do);
+ expect_token(f, Token_do);
else_stmt = convert_stmt_to_body(f, parse_stmt(f));
if (build_context.disallow_do) {
syntax_error(else_stmt, "'do' has been disallowed");
- } else if (!ast_on_same_line(cond, body)) {
- syntax_error(body, "The body of a 'do' be on the same line as 'else'");
+ } else if (!ast_on_same_line(else_token, else_stmt)) {
+ syntax_error(else_stmt, "The body of a 'do' be on the same line as 'else'");
}
} break;
default:
@@ -4510,7 +4512,7 @@ Ast *parse_stmt(AstFile *f) {
case Token_OpenBrace:
return parse_block_stmt(f, true);
case Token_do: {
- Token arrow = expect_token(f, Token_do);
+ expect_token(f, Token_do);
Ast *stmt = convert_stmt_to_body(f, parse_stmt(f));
if (build_context.disallow_do) {
syntax_error(stmt, "'do' has been disallowed");