Do not evaluate an untaken ELIF's condition

Fixes #764
This commit is contained in:
Rangi
2021-03-22 00:25:22 -04:00
committed by Eldred Habert
parent 46d6652df1
commit aa99ed056c
6 changed files with 38 additions and 2 deletions

View File

@@ -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;

View File

@@ -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

View File

@@ -0,0 +1,2 @@
FATAL: elif-after-taken-if.asm(21):
Division by zero

View File

@@ -0,0 +1,2 @@
taken if
taken elif

View File

@@ -3,7 +3,7 @@ mac: MACRO
println "small \1"
elif (\1) > 100
println "large \1"
elif (\1) / 0 == 42 ; only evaluated if the "large" condition was taken
elif (\1) / 0 == 42 ; only evaluated if neither "small" nor "large" was taken
println "division by zero!?"
elif syntax! error?
println "X_X"
@@ -15,3 +15,4 @@ ENDM
mac 2 + 2
mac STRLEN("abcdef")
mac 101
mac 23

View File

@@ -1,2 +1,2 @@
FATAL: skip-elif-condition.asm(17) -> skip-elif-condition.asm::mac(6):
FATAL: skip-elif-condition.asm(18) -> skip-elif-condition.asm::mac(6):
Division by zero