diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index a4cb42383a4..bfd4a1b5c3d 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -123,6 +123,20 @@ static bool isExecutableScope(const Token* tok) return false; } +static bool isEnumDefinition(const Token* tok) +{ + if (!Token::Match(tok, "enum class| %name% {|:")) + return false; + while (!Token::Match(tok, "[{:]")) + tok = tok->next(); + if (tok->str() == "{") + return true; + tok = tok->next(); // skip ':' + while (Token::Match(tok, "%name%|::")) + tok = tok->next(); + return Token::simpleMatch(tok, "{"); +} + void SymbolDatabase::createSymbolDatabaseFindAllScopes() { // create global scope @@ -163,8 +177,7 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes() if ((tok->isCpp() && tok->isKeyword() && ((Token::Match(tok, "class|struct|union|namespace ::| %name% final| {|:|::|<") && !Token::Match(tok->previous(), "new|friend|const|enum|typedef|mutable|volatile|using|)|(|<")) || - (Token::Match(tok, "enum class| %name% {") || - Token::Match(tok, "enum class| %name% : %name% ::|{")))) + isEnumDefinition(tok))) || (tok->isC() && tok->isKeyword() && Token::Match(tok, "struct|union|enum %name% {"))) { const Token *tok2 = tok->tokAt(2); diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 271ba73770c..01a54720496 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -6372,6 +6372,7 @@ class TestSymbolDatabase : public TestFixture { void enum17() { { GET_SYMBOL_DB("struct S {\n" // #12564 + " enum class E : std::uint8_t;\n" " enum class E : std::uint8_t { E0 };\n" " static void f(S::E e) {\n" " if (e == S::E::E0) {}\n"