diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index bbf668717..1c7cca614 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -3323,7 +3323,7 @@ void Tokenizer::createLinks2() } else if (token->str() == ">" || token->str() == ">>") { if (links.empty()) // < and > don't match. continue; - if (token->next() && !token->next()->isName() && !Token::Match(token->next(), ">|&|*|::|,")) + if (token->next() && !token->next()->isName() && !Token::Match(token->next(), ">|&|*|::|,|(")) continue; // Check type of open link diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index f616920e2..d553bad2c 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -5017,6 +5017,8 @@ private: // f () ASSERT_EQUALS(true, tok->linkAt(5) == tok->tokAt(6)); ASSERT_EQUALS(true, tok->linkAt(6) == tok->tokAt(5)); + + ASSERT_EQUALS("", errout.str()); } { @@ -5041,6 +5043,8 @@ private: // a[0] ASSERT_EQUALS(true, tok->linkAt(21) == tok->tokAt(23)); ASSERT_EQUALS(true, tok->linkAt(23) == tok->tokAt(21)); + + ASSERT_EQUALS("", errout.str()); } { @@ -5060,6 +5064,8 @@ private: // g( ASSERT_EQUALS(true, tok->linkAt(8) == tok->tokAt(9)); ASSERT_EQUALS(true, tok->linkAt(9) == tok->tokAt(8)); + + ASSERT_EQUALS("", errout.str()); } { @@ -5087,6 +5093,26 @@ private: // af ASSERT_EQUALS(0, (long long)tok->linkAt(28)); ASSERT_EQUALS(0, (long long)tok->linkAt(32)); + + ASSERT_EQUALS("", errout.str()); + } + + { + const char code[] = "void foo() {\n" + " return static_cast(a);\n" + "}"; + errout.str(""); + Settings settings; + Tokenizer tokenizer(&settings, this); + std::istringstream istr(code); + tokenizer.tokenize(istr, "test.cpp"); + const Token *tok = tokenizer.tokens(); + + // static_cast< + ASSERT_EQUALS((long long)tok->tokAt(9), (long long)tok->linkAt(7)); + ASSERT_EQUALS((long long)tok->tokAt(7), (long long)tok->linkAt(9)); + + ASSERT_EQUALS("", errout.str()); } } diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index bc311078c..2e9f702ee 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -133,6 +133,7 @@ private: TEST_CASE(localvarUnused); TEST_CASE(localvarFunction); // ticket #1799 TEST_CASE(localvarIfNOT); // #3104 - if ( NOT var ) + TEST_CASE(localvarAnd); // #3672 } void checkStructMemberUsage(const char code[]) { @@ -3005,6 +3006,16 @@ private: "}"); ASSERT_EQUALS("", errout.str()); } + + void localvarAnd() { // #3672 + functionVariableUsage("int main() {\n" + " unsigned flag = 0x1 << i;\n" + " if (m_errorflags & flag) {\n" + " return 1;\n" + " }\n" + "}"); + ASSERT_EQUALS("", errout.str()); + } }; REGISTER_TEST(TestUnusedVar)