Fixed #3928 (Tokenizer: Wrong simplification of inner if-else 'if (a) while (b) if (c) x; else y;')

This commit is contained in:
Erik Lax 2013-01-24 16:53:20 +01:00 committed by Daniel Marjamäki
parent 392960513b
commit c2608108dd
2 changed files with 26 additions and 0 deletions

View File

@ -3962,6 +3962,10 @@ bool Tokenizer::simplifyIfAddBraces()
tok = tok->next();
Token *tempToken = tok;
// if (cond1) for(;;) if (cond2) ; else ;
while (Token::Match(tempToken->next(), "for|while|BOOST_FOREACH ("))
tempToken = tempToken->linkAt(2);
bool innerIf = (tempToken->next() && tempToken->next()->str() == "if");
if (Token::simpleMatch(tempToken->next(), "do {"))

View File

@ -107,6 +107,7 @@ private:
TEST_CASE(ifAddBraces16); // ticket # 2739 (segmentation fault)
TEST_CASE(ifAddBraces17); // '} else' should be in the same line
TEST_CASE(ifAddBraces18); // #3424 - if if { } else else
TEST_CASE(ifAddBraces19); // #3928 - if for if else
TEST_CASE(whileAddBraces);
TEST_CASE(doWhileAddBraces);
@ -1191,6 +1192,27 @@ private:
tokenizeAndStringify("{ if(x) if(y){}else;else;}", false));
}
void ifAddBraces19() {
// #3928 - if for if else
const char code[] = "void f()\n"
"{\n"
" if (a)\n"
" for (;;)\n"
" if (b)\n"
" bar1();\n"
" else\n"
" bar2();\n"
"}\n";
ASSERT_EQUALS("void f ( )\n"
"{\n"
"if ( a ) {\n"
"for ( ; ; ) {\n"
"if ( b ) {\n"
"bar1 ( ) ;\n"
"} else {\n"
"bar2 ( ) ; } } }\n"
"}", tokenizeAndStringify(code, true));
}
void whileAddBraces() {