simplifyCondition: handle also '( a || true || b)' -> '(true)' and '( a && false && b)' -> '(false)'.
Clarify a comment about previous commit.
This commit is contained in:
parent
0f1f3c0f5f
commit
421ae9df03
|
@ -3955,7 +3955,7 @@ bool Tokenizer::removeRedundantConditions()
|
|||
if (Token::simpleMatch(elseTag, "else {")) {
|
||||
// Handle else
|
||||
if (boolValue == false) {
|
||||
// Convert "if( false ) {aaa;} else {bbb;}" => "{bbb;}" or ";{bbb;}"
|
||||
// Convert "if( false ) {aaa;} else {bbb;}" => "{bbb;}"
|
||||
|
||||
//remove '(false)'
|
||||
tok->deleteNext(3);
|
||||
|
@ -4508,6 +4508,30 @@ bool Tokenizer::simplifyConditions()
|
|||
ret = true;
|
||||
}
|
||||
|
||||
else if (Token::simpleMatch(tok, "&& false &&") ||
|
||||
Token::simpleMatch(tok, "|| true ||")) {
|
||||
//goto '('
|
||||
Token *tok2 = tok;
|
||||
while (tok2->previous()) {
|
||||
if (tok2->previous()->str() == ")")
|
||||
tok2 = tok2->previous()->link();
|
||||
else {
|
||||
tok2 = tok2->previous();
|
||||
if (tok2->str() == "(")
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!tok2)
|
||||
continue;
|
||||
//move tok to 'true|false' position
|
||||
tok = tok->next();
|
||||
//remove everything before 'true|false'
|
||||
Token::eraseTokens(tok2, tok);
|
||||
//remove everything after 'true|false'
|
||||
Token::eraseTokens(tok, tok2->link());
|
||||
ret = true;
|
||||
}
|
||||
|
||||
// Change numeric constant in condition to "true" or "false"
|
||||
if (Token::Match(tok, "if|while ( %num% )|%oror%|&&")) {
|
||||
tok->tokAt(2)->str((tok->strAt(2) != "0") ? "true" : "false");
|
||||
|
|
|
@ -6359,6 +6359,42 @@ private:
|
|||
"}";
|
||||
ASSERT_EQUALS("void f ( int a ) { g ( ) ; }", tok(code));
|
||||
}
|
||||
|
||||
{
|
||||
const char code[] =
|
||||
"void f(int a)\n"
|
||||
"{\n"
|
||||
"if (a || true || b) g();\n"
|
||||
"}";
|
||||
ASSERT_EQUALS("void f ( int a ) { g ( ) ; }", tok(code));
|
||||
}
|
||||
|
||||
{
|
||||
const char code[] =
|
||||
"void f(int a)\n"
|
||||
"{\n"
|
||||
"if (a && false && b) g();\n"
|
||||
"}";
|
||||
ASSERT_EQUALS("void f ( int a ) { }", tok(code));
|
||||
}
|
||||
|
||||
{
|
||||
const char code[] =
|
||||
"void f(int a)\n"
|
||||
"{\n"
|
||||
"if (a || (b && false && c) || d) g();\n"
|
||||
"}";
|
||||
ASSERT_EQUALS("void f ( int a ) { if ( a || d ) { g ( ) ; } }", tok(code));
|
||||
}
|
||||
|
||||
{
|
||||
const char code[] =
|
||||
"void f(int a)\n"
|
||||
"{\n"
|
||||
"if ((a && b) || true || (c && d)) g();\n"
|
||||
"}";
|
||||
ASSERT_EQUALS("void f ( int a ) { g ( ) ; }", tok(code));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue