diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index e94b51ce1..21a7496bb 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -4527,21 +4527,21 @@ void Tokenizer::simplifyIfNot() if (!tok) break; - if (Token::simpleMatch(tok, "0 == (") || - Token::Match(tok, "0 == %var%")) + if (Token::Match(tok, "0|false == (") || + Token::Match(tok, "0|false == %var%")) { tok->deleteNext(); tok->str("!"); } - else if (Token::Match(tok, "%var% == 0")) + else if (Token::Match(tok, "%var% == 0|false")) { tok->deleteNext(); tok->next()->str(tok->str()); tok->str("!"); } - else if (Token::Match(tok, "%var% .|:: %var% == 0")) + else if (Token::Match(tok, "%var% .|:: %var% == 0|false")) { tok = tok->previous(); tok->insertToken("!"); @@ -4549,7 +4549,7 @@ void Tokenizer::simplifyIfNot() Token::eraseTokens(tok, tok->tokAt(3)); } - else if (Token::Match(tok, "* %var% == 0")) + else if (Token::Match(tok, "* %var% == 0|false")) { tok = tok->previous(); tok->insertToken("!"); @@ -4558,7 +4558,7 @@ void Tokenizer::simplifyIfNot() } } - else if (tok->link() && Token::simpleMatch(tok, ") == 0")) + else if (tok->link() && Token::Match(tok, ") == 0|false")) { Token::eraseTokens(tok, tok->tokAt(3)); if (Token::Match(tok->link()->previous(), "%var%")) diff --git a/test/testpreprocessor.cpp b/test/testpreprocessor.cpp index 220691f1f..8a37f84b4 100644 --- a/test/testpreprocessor.cpp +++ b/test/testpreprocessor.cpp @@ -1299,7 +1299,7 @@ private: "ABC(1);\n" "ABC(2,3);\n" "ABC(4,5,6);\n"; - + // When this TODO assertion works, #1475 is probably fixed TODO_ASSERT_EQUALS("\n\n\n1 + 0 * 0\n2 + 03 * 0\n4 + 05 * 06\n", OurPreprocessor::expandMacros(filedata)); } diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index b25c30827..06e52164c 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -448,77 +448,41 @@ private: void pointers_condition() { - const char code[] = "void f()\n" - "{\n" - " if (p != NULL);\n" - " if (NULL != p);\n" - " if (this->p != NULL);\n" - " if (NULL != this->p);\n" - " if (Foo::p != NULL);\n" - " if (NULL != Foo::p);\n" - " while (p != NULL);\n" - " while (NULL != p);\n" - " while (this->p != NULL);\n" - " while (NULL != this->p);\n" - " while (Foo::p != NULL);\n" - " while (NULL != Foo::p);\n" - " if (p == NULL);\n" - " if (NULL == p);\n" - " if (this->p == NULL);\n" - " if (NULL == this->p);\n" - " if (Foo::p == NULL);\n" - " if (NULL == Foo::p);\n" - " while (p == NULL);\n" - " while (NULL == p);\n" - " while (this->p == NULL);\n" - " while (NULL == this->p);\n" - " while (Foo::p == NULL);\n" - " while (NULL == Foo::p);\n" - " if (p1 != NULL || p2 == NULL) { ; }\n" - " if (p1 != NULL && p2 == NULL) { ; }\n" - " if (p == '\\0');\n" - " if (p == 0L);\n" - " if (p == 0UL);\n" - " if (p == 0ul);\n" - " if (p == 0l);\n" - "}\n"; + ASSERT_EQUALS("( p )", tokenizeAndStringify("( p != NULL )", true)); + ASSERT_EQUALS("( p )", tokenizeAndStringify("( NULL != p )", true)); + ASSERT_EQUALS("( this . p )", tokenizeAndStringify("( this->p != NULL )", true)); + ASSERT_EQUALS("( this . p )", tokenizeAndStringify("( NULL != this->p )", true)); + ASSERT_EQUALS("( Foo :: p )", tokenizeAndStringify("( Foo::p != NULL )", true)); + ASSERT_EQUALS("( Foo :: p )", tokenizeAndStringify("( NULL != Foo::p )", true)); - ASSERT_EQUALS("void f ( )\n" - "{\n" - "if ( p ) { ; }\n" - "if ( p ) { ; }\n" - "if ( this . p ) { ; }\n" - "if ( this . p ) { ; }\n" - "if ( Foo :: p ) { ; }\n" - "if ( Foo :: p ) { ; }\n" - "while ( p ) { ; }\n" - "while ( p ) { ; }\n" - "while ( this . p ) { ; }\n" - "while ( this . p ) { ; }\n" - "while ( Foo :: p ) { ; }\n" - "while ( Foo :: p ) { ; }\n" - "if ( ! p ) { ; }\n" - "if ( ! p ) { ; }\n" - "if ( ! this . p ) { ; }\n" - "if ( ! this . p ) { ; }\n" - "if ( ! Foo :: p ) { ; }\n" - "if ( ! Foo :: p ) { ; }\n" - "while ( ! p ) { ; }\n" - "while ( ! p ) { ; }\n" - "while ( ! this . p ) { ; }\n" - "while ( ! this . p ) { ; }\n" - "while ( ! Foo :: p ) { ; }\n" - "while ( ! Foo :: p ) { ; }\n" - "if ( p1 || ! p2 ) { ; }\n" - "if ( p1 && ! p2 ) { ; }\n" - "if ( ! p ) { ; }\n" - "if ( ! p ) { ; }\n" - "if ( ! p ) { ; }\n" - "if ( ! p ) { ; }\n" - "if ( ! p ) { ; }\n" - "}", tokenizeAndStringify(code, true)); + ASSERT_EQUALS("( ! p )", tokenizeAndStringify("( p == NULL )", true)); + ASSERT_EQUALS("( ! p )", tokenizeAndStringify("( NULL == p )", true)); + ASSERT_EQUALS("( ! this . p )", tokenizeAndStringify("( this->p == NULL )", true)); + ASSERT_EQUALS("( ! this . p )", tokenizeAndStringify("( NULL == this->p )", true)); + ASSERT_EQUALS("( ! Foo :: p )", tokenizeAndStringify("( Foo::p == NULL )", true)); + ASSERT_EQUALS("( ! Foo :: p )", tokenizeAndStringify("( NULL == Foo::p )", true)); + + ASSERT_EQUALS("( p1 || ! p2 )", tokenizeAndStringify("( p1 != NULL || p2 == NULL )", true)); + ASSERT_EQUALS("( p1 && ! p2 )", tokenizeAndStringify("( p1 != NULL && p2 == NULL )", true)); + + ASSERT_EQUALS("( ! p )", tokenizeAndStringify("( p == false )", true)); + ASSERT_EQUALS("( ! p )", tokenizeAndStringify("( p == 0 )", true)); + ASSERT_EQUALS("( ! p )", tokenizeAndStringify("( p == '\\0' )", true)); + ASSERT_EQUALS("( ! p )", tokenizeAndStringify("( p == 0L )", true)); + ASSERT_EQUALS("( ! p )", tokenizeAndStringify("( p == 0UL )", true)); + ASSERT_EQUALS("( ! p )", tokenizeAndStringify("( p == 0ul )", true)); + ASSERT_EQUALS("( ! p )", tokenizeAndStringify("( p == 0l )", true)); + + ASSERT_EQUALS("( ! p )", tokenizeAndStringify("( false == p )", true)); + ASSERT_EQUALS("( ! p )", tokenizeAndStringify("( 0 == p )", true)); + ASSERT_EQUALS("( ! p )", tokenizeAndStringify("( '\\0' == p )", true)); + ASSERT_EQUALS("( ! p )", tokenizeAndStringify("( 0L == p )", true)); + ASSERT_EQUALS("( ! p )", tokenizeAndStringify("( 0UL == p )", true)); + ASSERT_EQUALS("( ! p )", tokenizeAndStringify("( 0ul == p )", true)); + ASSERT_EQUALS("( ! p )", tokenizeAndStringify("( 0l == p )", true)); } + void ifAddBraces1() { const char code[] = "void f()\n"