diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 7344887b3..36b96caa3 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -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 {")) diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 381c5e7b2..ffbf55bf8 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -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() {