diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 339ea640e..a3c772210 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -3254,7 +3254,8 @@ void SymbolDatabase::addClassFunction(Scope **scope, const Token **tok, const To } } - if (scope1->className == tok1->str() && (scope1->type != Scope::eFunction)) { + const bool isAnonymousNamespace = (scope1->type == Scope::eNamespace && scope1->className.empty()); + if ((scope1->className == tok1->str() && (scope1->type != Scope::eFunction)) || isAnonymousNamespace) { // do the scopes match (same scope) or do their names match (multiple namespaces) if ((*scope == scope1->nestedIn) || (*scope && (*scope)->className == scope1->nestedIn->className && @@ -3286,6 +3287,8 @@ void SymbolDatabase::addClassFunction(Scope **scope, const Token **tok, const To tok1 = tok1->tokAt(2); scope2 = scope2->findRecordInNestedList(tok1->str()); } + if (isAnonymousNamespace) + scope2 = scope2->findRecordInNestedList(tok1->str()); if (count == 1 && scope2) { match = true; diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 103716158..559adb261 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -373,6 +373,7 @@ private: TEST_CASE(createSymbolDatabaseFindAllScopes4); TEST_CASE(createSymbolDatabaseFindAllScopes5); TEST_CASE(createSymbolDatabaseFindAllScopes6); + TEST_CASE(createSymbolDatabaseFindAllScopes7); TEST_CASE(createSymbolDatabaseIncompleteVars); @@ -5461,6 +5462,31 @@ private: ASSERT_EQUALS(classNC.derivedFrom[1].type, &classNB); } + void createSymbolDatabaseFindAllScopes7() + { + GET_SYMBOL_DB("namespace {\n" + " struct S {\n" + " void f();\n" + " };\n" + "}\n" + "void S::f() {}\n"); + ASSERT(db); + ASSERT_EQUALS(4, db->scopeList.size()); + auto anon = db->scopeList.begin(); + ++anon; + ASSERT(anon->className.empty()); + ASSERT_EQUALS(anon->type, Scope::eNamespace); + auto S = anon; + ++S; + ASSERT_EQUALS(S->type, Scope::eStruct); + ASSERT_EQUALS(S->className, "S"); + ASSERT_EQUALS(S->nestedIn, &*anon); + const Token* f = Token::findsimplematch(tokenizer.tokens(), "f ( ) {"); + ASSERT(f && f->function() && f->function()->functionScope && f->function()->functionScope->bodyStart); + ASSERT_EQUALS(f->function()->functionScope->functionOf, &*S); + ASSERT_EQUALS(f->function()->functionScope->bodyStart->linenr(), 6); + } + void createSymbolDatabaseIncompleteVars() { {