diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 3be12c9d1..bc9e74062 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -479,8 +479,10 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes() // check for end of scope else if (tok == scope->bodyEnd) { - access.erase(scope); - scope = const_cast(scope->nestedIn); + do { + access.erase(scope); + scope = const_cast(scope->nestedIn); + } while (scope->type != Scope::eGlobal && succeeds(tok, scope->bodyEnd)); continue; } // check for end of init list diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 49abc9317..62e3552f5 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -372,6 +372,7 @@ private: TEST_CASE(createSymbolDatabaseFindAllScopes2); TEST_CASE(createSymbolDatabaseFindAllScopes3); TEST_CASE(createSymbolDatabaseFindAllScopes4); + TEST_CASE(createSymbolDatabaseFindAllScopes5); TEST_CASE(enum1); TEST_CASE(enum2); @@ -5133,6 +5134,31 @@ private: ASSERT(var1->variable()); } + void createSymbolDatabaseFindAllScopes5() + { + GET_SYMBOL_DB("class C {\n" + "public:\n" + " template\n" + " class D;\n" + " template\n" + " struct O : public std::false_type {};\n" + "};\n" + "template\n" + "struct C::O> : public std::true_type {};\n" + "template\n" + "class C::D {};\n" + "struct S {\n" + " S(int i) : m(i) {}\n" + " static const S IN;\n" + " int m;\n" + "};\n" + "const S S::IN(1);\n"); + ASSERT(db); + ASSERT_EQUALS(6, db->scopeList.size()); + const Token* const var = Token::findsimplematch(tokenizer.tokens(), "IN ("); + TODO_ASSERT(var && var->variable()); + } + void enum1() { GET_SYMBOL_DB("enum BOOL { FALSE, TRUE }; enum BOOL b;");