diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index b0fc121dd..d961a9f6e 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -4085,6 +4085,7 @@ void VariableMap::addVariable(const std::string& varname, bool globalNamespace) static bool setVarIdParseDeclaration(Token** tok, const VariableMap& variableMap, bool executableScope, bool cpp, bool c) { + const Token* const tok1 = *tok; Token* tok2 = *tok; if (!tok2->isName()) return false; @@ -4209,13 +4210,15 @@ static bool setVarIdParseDeclaration(Token** tok, const VariableMap& variableMap // Check if array declaration is valid (#2638) // invalid declaration: AAA a[4] = 0; - if (typeCount >= 2 && executableScope && tok2 && tok2->str() == "[") { - const Token *tok3 = tok2->link()->next(); + if (typeCount >= 2 && executableScope && Token::Match(tok2, ")| [")) { + const Token *tok3 = tok2->str() == ")" ? tok2->next() : tok2; while (tok3 && tok3->str() == "[") { tok3 = tok3->link()->next(); } if (Token::Match(tok3, "= %num%")) return false; + if (bracket && Token::Match(tok1->previous(), "[(,]") && Token::Match(tok3, "[,)]")) + return false; } return (typeCount >= 2 && tok2 && Token::Match(tok2->tokAt(-2), "!!:: %type%")); diff --git a/test/testvarid.cpp b/test/testvarid.cpp index 55b64b93b..1fdd495e7 100644 --- a/test/testvarid.cpp +++ b/test/testvarid.cpp @@ -99,6 +99,7 @@ private: TEST_CASE(varid65); // #10936 TEST_CASE(varid66); TEST_CASE(varid67); // #11711 - NOT function pointer + TEST_CASE(varid68); // #11740 - switch (str_chars(&strOut)[0]) TEST_CASE(varid_for_1); TEST_CASE(varid_for_2); TEST_CASE(varid_cpp_keywords_in_c_code); @@ -1225,6 +1226,21 @@ private: ASSERT_EQUALS(expected1, tokenize(code1, "test.c")); } + void varid68() { // #11740 + const char code1[] = "struct S {};\n" + "char* str_chars(struct S* s);\n" + "void f(struct S strOut) {\n" + " switch (str_chars(&strOut)[0]) {}\n" + "}"; + const char expected1[] = "1: struct S { } ;\n" + "2: char * str_chars ( struct S * s@1 ) ;\n" + "3: void f ( struct S strOut@2 ) {\n" + "4: switch ( str_chars ( & strOut@2 ) [ 0 ] ) { }\n" + "5: }\n"; + ASSERT_EQUALS(expected1, tokenize(code1, "test.c")); + ASSERT_EQUALS(expected1, tokenize(code1, "test.cpp")); + } + void varid_for_1() { const char code[] = "void foo(int a, int b) {\n" " for (int a=1,b=2;;) {}\n"