diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 31551764b7b..37a6036cdda 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -108,7 +108,7 @@ static bool isClassStructUnionEnumStart(const Token * tok) if (!Token::Match(tok->previous(), "class|struct|union|enum|%name%|>|>> {")) return false; const Token * tok2 = tok->previous(); - while (tok2 && !Token::Match(tok2, "class|struct|union|enum|{|}|)|;|>|>>")) + while (tok2 && !Token::Match(tok2, "class|struct|union|enum|{|}|)|;")) tok2 = tok2->previous(); return Token::Match(tok2, "class|struct|union|enum") && !Token::simpleMatch(tok2->tokAt(-1), "->"); } diff --git a/test/testvarid.cpp b/test/testvarid.cpp index 32bff9c5724..55627299e1d 100644 --- a/test/testvarid.cpp +++ b/test/testvarid.cpp @@ -149,6 +149,7 @@ class TestVarID : public TestFixture { TEST_CASE(varid_in_class26); TEST_CASE(varid_in_class27); TEST_CASE(varid_in_class28); + TEST_CASE(varid_in_class29); TEST_CASE(varid_namespace_1); // #7272 TEST_CASE(varid_namespace_2); // #7000 TEST_CASE(varid_namespace_3); // #8627 @@ -2380,6 +2381,28 @@ class TestVarID : public TestFixture { ASSERT_EQUALS(expected, tokenize(code)); } + void varid_in_class29() { + const char code[] = "struct S {\n" // #14486 + " const int& r;\n" + " explicit S(const int& r) : r(r) {}\n" + " static void f() {\n" + " struct T : std::vector {\n" + " bool g() const { return empty(); }\n" + " };\n" + " }\n" + "};\n"; + const char expected[] = "1: struct S {\n" + "2: const int & r@1 ;\n" + "3: explicit S ( const int & r@2 ) : r@1 ( r@2 ) { }\n" + "4: static void f ( ) {\n" + "5: struct T : std :: vector < int > {\n" + "6: bool g ( ) const { return empty ( ) ; }\n" + "7: } ;\n" + "8: }\n" + "9: } ;\n"; + ASSERT_EQUALS(expected, tokenize(code)); + } + void varid_namespace_1() { // #7272 const char code[] = "namespace Blah {\n" " struct foo { int x;};\n"