diff --git a/src/asm/asmy.y b/src/asm/asmy.y index 81093c72..653c001e 100644 --- a/src/asm/asmy.y +++ b/src/asm/asmy.y @@ -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; } ; diff --git a/test/asm/if-macro.asm b/test/asm/if-macro.asm new file mode 100644 index 00000000..427e5eb3 --- /dev/null +++ b/test/asm/if-macro.asm @@ -0,0 +1,13 @@ +m: macro + if 0 + WARN "3" + else + WARN "5" + endc +endm + +if 1 + m +else + WARN "12" +endc diff --git a/test/asm/if-macro.err b/test/asm/if-macro.err new file mode 100644 index 00000000..23463fe9 --- /dev/null +++ b/test/asm/if-macro.err @@ -0,0 +1,2 @@ +warning: if-macro.asm(10) -> if-macro.asm::m(5): [-Wuser] + 5 diff --git a/test/asm/if-macro.out b/test/asm/if-macro.out new file mode 100644 index 00000000..e69de29b