Fixed #592 (Tokenizer: improve the tokenization of do .. while)
http://sourceforge.net/apps/trac/cppcheck/ticket/592
This commit is contained in:
parent
94c49bc34e
commit
acc38a8bbf
|
@ -1561,6 +1561,7 @@ void Tokenizer::simplifyTokenList()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
simplifyDoWhileAddBraces();
|
||||||
simplifyIfAddBraces();
|
simplifyIfAddBraces();
|
||||||
simplifyFunctionParameters();
|
simplifyFunctionParameters();
|
||||||
|
|
||||||
|
@ -1884,6 +1885,54 @@ bool Tokenizer::simplifyIfAddBraces()
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Tokenizer::simplifyDoWhileAddBraces()
|
||||||
|
{
|
||||||
|
bool ret = false;
|
||||||
|
|
||||||
|
for (Token *tok = _tokens; tok; tok = (tok ? tok->next() : NULL))
|
||||||
|
{
|
||||||
|
if (! Token::Match(tok, "do !!{"))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Token *tok1 = tok; // token with "do"
|
||||||
|
Token *tok2 = NULL; // token with "while"
|
||||||
|
Token *tok3 = tok;
|
||||||
|
|
||||||
|
// skip loop body
|
||||||
|
while (tok3)
|
||||||
|
{
|
||||||
|
if (tok3->str() == "while")
|
||||||
|
{
|
||||||
|
tok2 = tok3;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
tok3 = tok3->next();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tok2)
|
||||||
|
{
|
||||||
|
// insert "{" after "do"
|
||||||
|
tok1->insertToken("{");
|
||||||
|
|
||||||
|
// insert "}" before "while"
|
||||||
|
tok2->previous()->insertToken("}");
|
||||||
|
|
||||||
|
// allow link() works
|
||||||
|
tok1 = tok1->next();
|
||||||
|
tok2 = tok2->previous();
|
||||||
|
tok1->link(tok2);
|
||||||
|
tok2->link(tok1);
|
||||||
|
|
||||||
|
ret = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
bool Tokenizer::simplifyConditionOperator()
|
bool Tokenizer::simplifyConditionOperator()
|
||||||
{
|
{
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
|
|
|
@ -185,6 +185,12 @@ private:
|
||||||
*/
|
*/
|
||||||
bool simplifyIfAddBraces();
|
bool simplifyIfAddBraces();
|
||||||
|
|
||||||
|
/** Add braces to an do-while block
|
||||||
|
* @return true if something is modified
|
||||||
|
* false if nothing is done.
|
||||||
|
*/
|
||||||
|
bool simplifyDoWhileAddBraces();
|
||||||
|
|
||||||
/** Simplify casts
|
/** Simplify casts
|
||||||
* @return true if something is modified
|
* @return true if something is modified
|
||||||
* false if nothing is done.
|
* false if nothing is done.
|
||||||
|
|
|
@ -62,6 +62,7 @@ private:
|
||||||
TEST_CASE(ifAddBraces8);
|
TEST_CASE(ifAddBraces8);
|
||||||
|
|
||||||
TEST_CASE(whileAddBraces);
|
TEST_CASE(whileAddBraces);
|
||||||
|
TEST_CASE(doWhileAddBraces);
|
||||||
|
|
||||||
TEST_CASE(numeric_true_condition);
|
TEST_CASE(numeric_true_condition);
|
||||||
TEST_CASE(pointers_condition);
|
TEST_CASE(pointers_condition);
|
||||||
|
@ -521,7 +522,13 @@ private:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void doWhileAddBraces()
|
||||||
|
{
|
||||||
|
const char code[] = "do ; while (0);";
|
||||||
|
const char result[] = "do { ; } while ( false ) ;";
|
||||||
|
|
||||||
|
ASSERT_EQUALS(result, tokenizeAndStringify(code, true));
|
||||||
|
}
|
||||||
|
|
||||||
void simplifyKnownVariables1()
|
void simplifyKnownVariables1()
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue