From d8900e9d4ac03924987c9dd5e97183aa5641c667 Mon Sep 17 00:00:00 2001 From: chrchr Date: Mon, 20 Nov 2023 18:25:27 +0100 Subject: [PATCH 1/2] Fix #12209 "debug: Executable scope 'x' with unknown function." with anonymous namespace --- lib/symboldatabase.cpp | 5 ++++- test/testsymboldatabase.cpp | 26 ++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 5e9c9d24081..1332d6fd9fe 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 13570130609..9788fb45968 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -373,6 +373,7 @@ class TestSymbolDatabase : public TestFixture { TEST_CASE(createSymbolDatabaseFindAllScopes4); TEST_CASE(createSymbolDatabaseFindAllScopes5); TEST_CASE(createSymbolDatabaseFindAllScopes6); + TEST_CASE(createSymbolDatabaseFindAllScopes7); TEST_CASE(createSymbolDatabaseIncompleteVars); @@ -5459,6 +5460,31 @@ class TestSymbolDatabase : public TestFixture { ASSERT_EQUALS(classNC.derivedFrom[0].type, &classNA); 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() { From 166264aa13a2cd4cf80158261491914d789999b4 Mon Sep 17 00:00:00 2001 From: chrchr Date: Mon, 20 Nov 2023 19:12:47 +0100 Subject: [PATCH 2/2] Format --- test/testsymboldatabase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 9788fb45968..f04455d38be 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -5460,7 +5460,7 @@ class TestSymbolDatabase : public TestFixture { ASSERT_EQUALS(classNC.derivedFrom[0].type, &classNA); ASSERT_EQUALS(classNC.derivedFrom[1].type, &classNB); } - + void createSymbolDatabaseFindAllScopes7() { GET_SYMBOL_DB("namespace {\n"