Fix else working incorrectly from macros

Since the "skip ELSE blocks" variable is global, it used to get carried
over from the macro's `if` to the outer's.
This commit is contained in:
ISSOtm
2020-08-18 12:27:37 +02:00
parent aa76603da9
commit f9b48c0cad
4 changed files with 23 additions and 7 deletions

View File

@@ -39,7 +39,7 @@ uint32_t nListCountEmpty;
char *tzNewMacro;
uint32_t ulNewMacroSize;
int32_t nPCOffset;
bool executedIfBlock; /* If this is set, ELIFs cannot be executed anymore */
bool executeElseBlock; /* If this is set, ELIFs cannot be executed anymore */
static uint32_t str2int2(uint8_t *s, int32_t length)
{
@@ -360,8 +360,8 @@ conditional : if
if : T_POP_IF const '\n' {
nIFDepth++;
executedIfBlock = !!$2;
if (!executedIfBlock)
executeElseBlock = !$2;
if (executeElseBlock)
lexer_SetMode(LEXER_SKIP_TO_ELIF);
}
;
@@ -370,11 +370,11 @@ elif : T_POP_ELIF const '\n' {
if (nIFDepth <= 0)
fatalerror("Found ELIF outside an IF construct\n");
if (executedIfBlock) {
if (!executeElseBlock) {
lexer_SetMode(LEXER_SKIP_TO_ENDC);
} else {
executedIfBlock = !!$2;
if (!executedIfBlock)
executeElseBlock = !$2;
if (executeElseBlock)
lexer_SetMode(LEXER_SKIP_TO_ELIF);
}
}
@@ -384,7 +384,7 @@ else : T_POP_ELSE '\n' {
if (nIFDepth <= 0)
fatalerror("Found ELSE outside an IF construct\n");
if (executedIfBlock)
if (!executeElseBlock)
lexer_SetMode(LEXER_SKIP_TO_ENDC);
}
;
@@ -394,6 +394,7 @@ endc : T_POP_ENDC '\n' {
fatalerror("Found ENDC outside an IF construct\n");
nIFDepth--;
executeElseBlock = false;
}
;

13
test/asm/if-macro.asm Normal file
View File

@@ -0,0 +1,13 @@
m: macro
if 0
WARN "3"
else
WARN "5"
endc
endm
if 1
m
else
WARN "12"
endc

2
test/asm/if-macro.err Normal file
View File

@@ -0,0 +1,2 @@
warning: if-macro.asm(10) -> if-macro.asm::m(5): [-Wuser]
5

0
test/asm/if-macro.out Normal file
View File