From b4f882354d5a4a52cdae4ea58d3316ea813bb5a0 Mon Sep 17 00:00:00 2001 From: "zik.saleeba" Date: Fri, 11 Feb 2011 06:27:54 +0000 Subject: [PATCH] Fixed a problem with nested while() loops not handling break and continue correctly. Fixes issue #96. git-svn-id: http://picoc.googlecode.com/svn/trunk@509 21eae674-98b7-11dd-bd71-f92a316d2d60 --- parse.c | 5 +++-- tests/48_nested_break.c | 24 ++++++++++++++++++++++++ tests/48_nested_break.expect | 1 + tests/Makefile | 3 ++- 4 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 tests/48_nested_break.c create mode 100644 tests/48_nested_break.expect 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: $*...