diff --git a/parse.c b/parse.c index 044b076..8327de5 100644 --- a/parse.c +++ b/parse.c @@ -516,6 +516,7 @@ enum ParseResult ParseStatement(struct ParseState *Parser, int CheckTrailingSemi case TokenWhile: { struct ParseState PreConditional; + enum RunMode PreMode = Parser->Mode; if (LexGetToken(Parser, NULL, TRUE) != TokenOpenBracket) ProgramFail(Parser, "'(' expected"); @@ -532,12 +533,12 @@ enum ParseResult ParseStatement(struct ParseState *Parser, int CheckTrailingSemi ProgramFail(Parser, "statement expected"); if (Parser->Mode == RunModeContinue) - Parser->Mode = RunModeRun; + Parser->Mode = PreMode; } while (Parser->Mode == RunModeRun && Condition); if (Parser->Mode == RunModeBreak) - Parser->Mode = RunModeRun; + Parser->Mode = PreMode; CheckTrailingSemicolon = FALSE; } diff --git a/tests/48_nested_break.c b/tests/48_nested_break.c new file mode 100644 index 0000000..4b01a99 --- /dev/null +++ b/tests/48_nested_break.c @@ -0,0 +1,24 @@ +#include + +int a; +char b; + +a = 0; +while (a < 2) +{ + printf("%d", a++); + break; + + b = 'A'; + while (b < 'C') + { + printf("%c", b++); + } + printf("e"); +} +printf("\n"); + +int main() +{ + return 0; +} diff --git a/tests/48_nested_break.expect b/tests/48_nested_break.expect new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/48_nested_break.expect @@ -0,0 +1 @@ +0 diff --git a/tests/Makefile b/tests/Makefile index 1c2609c..4a24acd 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -42,7 +42,8 @@ TESTS= 00_assignment.test \ 43_void_param.test \ 44_scoped_declarations.test \ 45_empty_for.test \ - 47_switch_return.test + 47_switch_return.test \ + 48_nested_break.test %.test: %.expect %.c @echo Test: $*...