Tokenizer: Simplify 'while (0)' better
This commit is contained in:
parent
b1e963fe2c
commit
197bcf17ba
|
@ -2214,6 +2214,7 @@ bool Tokenizer::simplifyTokenList()
|
|||
simplifyIfNotNull();
|
||||
simplifyComparisonOrder();
|
||||
simplifyNestedStrcat();
|
||||
simplifyWhile0();
|
||||
|
||||
for (Token *tok = _tokens; tok; tok = tok->next())
|
||||
{
|
||||
|
@ -4957,3 +4958,43 @@ void Tokenizer::getErrorMessages()
|
|||
{
|
||||
syntaxError(0, ' ');
|
||||
}
|
||||
|
||||
void Tokenizer::simplifyWhile0()
|
||||
{
|
||||
for (Token *tok = _tokens; tok; tok = tok->next())
|
||||
{
|
||||
if (!Token::simpleMatch(tok, "while ( 0 )"))
|
||||
continue;
|
||||
|
||||
// remove "while (0) { .. }"
|
||||
if (Token::simpleMatch(tok->tokAt(4), "{"))
|
||||
{
|
||||
Token::eraseTokens(tok, tok->tokAt(4)->link());
|
||||
tok->deleteThis(); // delete "while"
|
||||
tok->deleteThis(); // delete "}"
|
||||
}
|
||||
|
||||
if (Token::simpleMatch(tok->previous(), "}"))
|
||||
{
|
||||
// find "do"
|
||||
Token *tok2 = tok->previous()->link();
|
||||
tok2 = tok2 ? tok2->previous() : 0;
|
||||
if (tok2 && tok2->str() == "do")
|
||||
{
|
||||
// delete "do {"
|
||||
tok2->deleteThis();
|
||||
tok2->deleteThis();
|
||||
|
||||
// delete "} while ( 0 )"
|
||||
tok = tok->previous();
|
||||
tok->deleteNext(); // while
|
||||
tok->deleteNext(); // (
|
||||
tok->deleteNext(); // 0
|
||||
tok->deleteNext(); // )
|
||||
tok->deleteThis(); // }
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -320,6 +320,11 @@ private:
|
|||
*/
|
||||
void simplifyConst();
|
||||
|
||||
/**
|
||||
* simplify "while (0)"
|
||||
*/
|
||||
void simplifyWhile0();
|
||||
|
||||
/**
|
||||
* Remove exception specifications. This function calls itself recursively.
|
||||
* @param tok First token in scope to cleanup
|
||||
|
|
|
@ -149,6 +149,9 @@ private:
|
|||
TEST_CASE(pointeralias);
|
||||
|
||||
TEST_CASE(reduceConstness);
|
||||
|
||||
// simplify "while (0)"
|
||||
TEST_CASE(while0);
|
||||
}
|
||||
|
||||
std::string tok(const char code[], bool simplify = true)
|
||||
|
@ -991,7 +994,7 @@ private:
|
|||
" sizeof 1;\n"
|
||||
" while (0);\n"
|
||||
"}\n";
|
||||
ASSERT_EQUALS("void f ( ) { sizeof ( 1 ) ; while ( false ) { ; } }", tok(code));
|
||||
ASSERT_EQUALS("void f ( ) { sizeof ( 1 ) ; }", tok(code));
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
}
|
||||
|
||||
|
@ -2498,6 +2501,11 @@ private:
|
|||
{
|
||||
ASSERT_EQUALS("char * p ;", tok("char * const p;"));
|
||||
}
|
||||
|
||||
void while0()
|
||||
{
|
||||
ASSERT_EQUALS("; x = 1 ; ;", tok("; do { x = 1 ; } while (0);"));
|
||||
}
|
||||
};
|
||||
|
||||
REGISTER_TEST(TestSimplifyTokens)
|
||||
|
|
|
@ -65,7 +65,6 @@ private:
|
|||
TEST_CASE(ifAddBraces5);
|
||||
TEST_CASE(ifAddBraces6);
|
||||
TEST_CASE(ifAddBraces7);
|
||||
TEST_CASE(ifAddBraces8);
|
||||
TEST_CASE(ifAddBraces9);
|
||||
|
||||
TEST_CASE(whileAddBraces);
|
||||
|
@ -575,12 +574,6 @@ private:
|
|||
"}", tokenizeAndStringify(code, true));
|
||||
}
|
||||
|
||||
void ifAddBraces8()
|
||||
{
|
||||
const char code[] = "do { ; } while(0);";
|
||||
ASSERT_EQUALS("do { ; } while ( false ) ;", tokenizeAndStringify(code, true));
|
||||
}
|
||||
|
||||
void ifAddBraces9()
|
||||
{
|
||||
// ticket #990
|
||||
|
@ -610,9 +603,9 @@ private:
|
|||
{
|
||||
{
|
||||
const char code[] = "do ; while (0);";
|
||||
const char result[] = "do { ; } while ( false ) ;";
|
||||
const char result[] = "do { ; } while ( 0 ) ;";
|
||||
|
||||
ASSERT_EQUALS(result, tokenizeAndStringify(code, true));
|
||||
ASSERT_EQUALS(result, tokenizeAndStringify(code, false));
|
||||
}
|
||||
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue