diff --git a/addons/misra.py b/addons/misra.py index 43b92b51fb0..933ef4c2025 100755 --- a/addons/misra.py +++ b/addons/misra.py @@ -803,8 +803,7 @@ def get_function_pointer_type(tok): ret += '(' tok = tok.next.next while tok and (tok.str not in '()'): - if tok.varId is None: - ret += ' ' + tok.str + ret += ' ' + tok.str tok = tok.next if (tok is None) or tok.str != ')': return None diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 70a38a30eb9..6f9cf90a852 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -1025,7 +1025,12 @@ namespace { } bool Tokenizer::isFunctionPointer(const Token* tok) { - return Token::Match(tok, "%name% ) ("); + if (!Token::Match(tok, "%name%")) + return false; + tok = tok->next(); + while (Token::Match(tok, "[")) + tok = tok->link()->next(); + return Token::simpleMatch(tok, ") ("); } static bool matchCurrentType(const Token* tok, std::map& types) diff --git a/test/testvarid.cpp b/test/testvarid.cpp index 73eaa3f97eb..57b4bf1744a 100644 --- a/test/testvarid.cpp +++ b/test/testvarid.cpp @@ -1328,7 +1328,7 @@ class TestVarID : public TestFixture { ASSERT_EQUALS(expected2, tokenize(code2)); const char code3[] = "extern void (*arr[10])(uint32_t some);\n"; - const char expected3[] = "1: extern void ( * arr@1 [ 10 ] ) ( uint32_t some@2 ) ;\n"; + const char expected3[] = "1: extern void ( * arr@1 [ 10 ] ) ( uint32_t ) ;\n"; ASSERT_EQUALS(expected3, tokenize(code3)); const char code4[] = "_Static_assert(sizeof((struct S){0}.i) == 4);\n"; // #12729 @@ -3545,9 +3545,15 @@ class TestVarID : public TestFixture { "}\n"; ASSERT_EQUALS("1: void f ( ) {\n" "2: int * p@1 ;\n" - "3: void ( * a@2 [ 1 ] ) ( int * p ) = { 0 } ;\n" + "3: void ( * a@2 [ 1 ] ) ( int * ) = { 0 } ;\n" "4: }\n", tokenize(code4)); + + const char code5[] = "int *p;\n" + "void (*a[1])(int* p) = { 0 } ;\n"; + ASSERT_EQUALS("1: int * p@1 ;\n" + "2: void ( * a@2 [ 1 ] ) ( int * ) = { 0 } ;\n" + , tokenize(code5)); } void varid_alignas() {