diff --git a/src/asm/lexer.c b/src/asm/lexer.c index 305d479a45..dfe38ff11c 100644 --- a/src/asm/lexer.c +++ b/src/asm/lexer.c @@ -1856,6 +1856,8 @@ static char const *reportGarbageChar(unsigned char firstByte) /* Lexer core */ +static int yylex_SKIP_TO_ENDC(void); // forward declaration for yylex_NORMAL + static int yylex_NORMAL(void) { dbgPrint("Lexing in normal mode, line=%" PRIu32 ", col=%" PRIu32 "\n", @@ -2085,6 +2087,12 @@ static int yylex_NORMAL(void) if (startsIdentifier(c)) { int tokenType = readIdentifier(c); + /* An ELIF after a taken IF needs to not evaluate its condition */ + if (tokenType == T_POP_ELIF && lexerState->lastToken == T_NEWLINE + && lexer_GetIFDepth() > 0 && lexer_RanIFBlock() + && !lexer_ReachedELSEBlock()) + return yylex_SKIP_TO_ENDC(); + /* If a keyword, don't try to expand */ if (tokenType != T_ID && tokenType != T_LOCAL_ID) return tokenType; diff --git a/test/asm/elif-after-taken-if.asm b/test/asm/elif-after-taken-if.asm new file mode 100644 index 0000000000..1a71e6a1ff --- /dev/null +++ b/test/asm/elif-after-taken-if.asm @@ -0,0 +1,23 @@ +if 1 + println "taken if" +elif 2 / 0 ; avoided fatal "Division by zero" error + println "untaken elif" +elif 3 / 0 ; avoided fatal "Division by zero" error + println "untaken after untaken" +endc + +if 0 + println "untaken if" +elif 1 + println "taken elif" +elif !@#$ ; avoided fatal syntax error + println "untaken elif" +elif %^&* ; avoided fatal syntax error + println "untaken after untaken" +endc + +if 0 + println "untaken if" +elif 1 / 0 ; fatal "Division by zero" error + println "unreached elif" +endc diff --git a/test/asm/elif-after-taken-if.err b/test/asm/elif-after-taken-if.err new file mode 100644 index 0000000000..7bf9c9b02e --- /dev/null +++ b/test/asm/elif-after-taken-if.err @@ -0,0 +1,2 @@ +FATAL: elif-after-taken-if.asm(21): + Division by zero diff --git a/test/asm/elif-after-taken-if.out b/test/asm/elif-after-taken-if.out new file mode 100644 index 0000000000..ba285ed852 --- /dev/null +++ b/test/asm/elif-after-taken-if.out @@ -0,0 +1,2 @@ +taken if +taken elif