diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 70e63a924..5ef96ebf1 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -2470,7 +2470,7 @@ static bool setVarIdParseDeclaration(const Token **tok, const std::map ok else if (tok2->str() != ")" || tok2->link()->strAt(-1) != "catch") return false; // not catching by reference => not declaration @@ -2749,7 +2749,7 @@ void Tokenizer::setVarId() bool decl = setVarIdParseDeclaration(&tok2, variableId, scopeStack.top().isExecutable, isCPP(), isC()); if (decl) { const Token* prev2 = tok2->previous(); - if (Token::Match(prev2, "%type% [;[=,)]") && tok2->previous()->str() != "const") + if (Token::Match(prev2, "%type% [;[=,):]") && tok2->previous()->str() != "const") ; else if (Token::Match(prev2, "%type% ( !!)") && Token::simpleMatch(tok2->link(), ") ;")) { // In C++ , a variable can't be called operator+ or something like that. diff --git a/test/testvarid.cpp b/test/testvarid.cpp index 0d57cf2bc..314b76055 100644 --- a/test/testvarid.cpp +++ b/test/testvarid.cpp @@ -139,6 +139,7 @@ private: TEST_CASE(varid_cpp11initialization); // #4344 TEST_CASE(varid_inheritedMembers); // #4101 TEST_CASE(varid_header); // #6386 + TEST_CASE(varid_rangeBasedFor); TEST_CASE(varidclass1); TEST_CASE(varidclass2); @@ -2154,6 +2155,28 @@ private: "}; ", false, "test.h")); } + void varid_rangeBasedFor() { + ASSERT_EQUALS("\n\n##file 0\n" + "1: void reset ( Foo array@1 ) {\n" + "2: for ( auto & e@2 : array@1 ) {\n" + "3: foo ( e@2 ) ; }\n" + "4: } ;\n", + tokenize("void reset(Foo array) {\n" + " for (auto& e : array)\n" + " foo(e);\n" + "};")); + + ASSERT_EQUALS("\n\n##file 0\n" + "1: void reset ( Foo array@1 ) {\n" + "2: for ( auto e@2 : array@1 ) {\n" + "3: foo ( e@2 ) ; }\n" + "4: } ;\n", + tokenize("void reset(Foo array) {\n" + " for (auto e : array)\n" + " foo(e);\n" + "};")); + } + void varidclass1() { const std::string actual = tokenize( "class Fred\n"