Index: lldb/packages/Python/lldbsuite/test/functionalities/modern-type-lookup/namespace-lookup/Makefile =================================================================== --- /dev/null +++ lldb/packages/Python/lldbsuite/test/functionalities/modern-type-lookup/namespace-lookup/Makefile @@ -0,0 +1,2 @@ +CXX_SOURCES := main.cpp +include Makefile.rules Index: lldb/packages/Python/lldbsuite/test/functionalities/modern-type-lookup/namespace-lookup/TestNamespaceWithModernTypeLookup.py =================================================================== --- /dev/null +++ lldb/packages/Python/lldbsuite/test/functionalities/modern-type-lookup/namespace-lookup/TestNamespaceWithModernTypeLookup.py @@ -0,0 +1,19 @@ +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + +class NamespaceWithModernTypeLookup(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + def test(self): + self.build() + + # Activate modern-type-lookup. + self.runCmd("settings set target.experimental.use-modern-type-lookup true") + + lldbutil.run_to_source_breakpoint(self, + "// Set break point at this line.", lldb.SBFileSpec("main.cpp")) + + # Test lookup in namespace. + self.expect("expr A::i", substrs=["(int) ", " = 42\n"]) Index: lldb/packages/Python/lldbsuite/test/functionalities/modern-type-lookup/namespace-lookup/main.cpp =================================================================== --- /dev/null +++ lldb/packages/Python/lldbsuite/test/functionalities/modern-type-lookup/namespace-lookup/main.cpp @@ -0,0 +1,5 @@ +namespace A { int i = 42; } + +int main(int argc, char **argv) { + return A::i; // Set break point at this line. +} Index: lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.h =================================================================== --- lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.h +++ lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.h @@ -191,7 +191,7 @@ /// /// \param[in] context /// The NameSearchContext to use when filing results. - virtual void FindExternalVisibleDecls(NameSearchContext &context); + virtual bool FindExternalVisibleDecls(NameSearchContext &context); clang::Sema *getSema(); Index: lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp =================================================================== --- lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp +++ lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp @@ -259,10 +259,17 @@ llvm::SmallVector name_decls; NameSearchContext name_search_context(*this, name_decls, clang_decl_name, decl_ctx); - FindExternalVisibleDecls(name_search_context); + bool success = FindExternalVisibleDecls(name_search_context); SetExternalVisibleDeclsForName(decl_ctx, clang_decl_name, name_decls); // --g_depth; m_active_lookups.erase(uniqued_const_decl_name); + // The merger properly implements FindExternalVisibleDecls and returns + // true/false when it found something. There is still some non-modern-type + // lookup code in FindExternalVisibleDecls that could return a wrong value + // for success, so let's not trust the return value when we don't use + // modern-type-lookup. + if (HasMerger()) + return success || (name_decls.size() != 0); return (name_decls.size() != 0); } @@ -680,7 +687,7 @@ return; } -void ClangASTSource::FindExternalVisibleDecls(NameSearchContext &context) { +bool ClangASTSource::FindExternalVisibleDecls(NameSearchContext &context) { assert(m_ast_context); ClangASTMetrics::RegisterVisibleQuery(); @@ -715,8 +722,7 @@ name.GetCString(), context.m_decl_context->getDeclKindName()); } - if (HasMerger() && !isa(context.m_decl_context) - /* possibly handle NamespaceDecls here? */) { + if (HasMerger()) { if (auto *interface_decl = dyn_cast(context.m_decl_context)) { ObjCInterfaceDecl *complete_iface_decl = @@ -729,9 +735,9 @@ } } - GetMergerUnchecked().FindExternalVisibleDeclsByName(context.m_decl_context, - context.m_decl_name); - return; // otherwise we may need to fall back + if (GetMergerUnchecked().FindExternalVisibleDeclsByName( + context.m_decl_context, context.m_decl_name)) + return true; } context.m_namespace_map = std::make_shared(); @@ -747,7 +753,7 @@ static_cast(namespace_map->size())); if (!namespace_map) - return; + return false; for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end(); @@ -762,7 +768,7 @@ FindObjCPropertyAndIvarDecls(context); } else if (!isa(context.m_decl_context)) { // we shouldn't be getting FindExternalVisibleDecls calls for these - return; + return false; } else { CompilerDeclContext namespace_decl; @@ -785,6 +791,7 @@ if (clang_namespace_decl) clang_namespace_decl->setHasExternalVisibleStorage(); } + return false; } clang::Sema *ClangASTSource::getSema() { Index: lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.h =================================================================== --- lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.h +++ lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.h @@ -279,7 +279,7 @@ /// /// \return /// True on success; false otherwise. - void FindExternalVisibleDecls(NameSearchContext &context) override; + bool FindExternalVisibleDecls(NameSearchContext &context) override; /// Find all entities matching a given name in a given module/namespace, /// using a NameSearchContext to make Decls for them. Index: lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp =================================================================== --- lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp +++ lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp @@ -683,7 +683,7 @@ // Interface for ClangASTSource -void ClangExpressionDeclMap::FindExternalVisibleDecls( +bool ClangExpressionDeclMap::FindExternalVisibleDecls( NameSearchContext &context) { assert(m_ast_context); @@ -696,7 +696,7 @@ if (GetImportInProgress()) { if (log && log->GetVerbose()) LLDB_LOGF(log, "Ignoring a query during an import"); - return; + return false; } static unsigned int invocation_id = 0; @@ -732,32 +732,34 @@ context.m_decl_context))); FindExternalVisibleDecls(context, lldb::ModuleSP(), compiler_decl_ctx, current_id); - return; + return context.m_decls.size() != 0; } - ClangASTImporter::NamespaceMapSP namespace_map = - m_ast_importer_sp - ? m_ast_importer_sp->GetNamespaceMap(namespace_context) - : ClangASTImporter::NamespaceMapSP(); + // Only do this when we have a ClangASTImporter. + if (m_ast_importer_sp) { + ClangASTImporter::NamespaceMapSP namespace_map = + m_ast_importer_sp->GetNamespaceMap(namespace_context); - if (!namespace_map) - return; + if (!namespace_map) + return context.m_decls.size() != 0; - if (log && log->GetVerbose()) - log->Printf(" CEDM::FEVD[%u] Inspecting (NamespaceMap*)%p (%d entries)", - current_id, static_cast(namespace_map.get()), - (int)namespace_map->size()); + if (log && log->GetVerbose()) + log->Printf(" CEDM::FEVD[%u] Inspecting (NamespaceMap*)%p (%d entries)", + current_id, static_cast(namespace_map.get()), + (int)namespace_map->size()); - for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), - e = namespace_map->end(); - i != e; ++i) { - if (log) - log->Printf(" CEDM::FEVD[%u] Searching namespace %s in module %s", - current_id, i->second.GetName().AsCString(), - i->first->GetFileSpec().GetFilename().GetCString()); + for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), + e = namespace_map->end(); + i != e; ++i) { + if (log) + log->Printf(" CEDM::FEVD[%u] Searching namespace %s in module %s", + current_id, i->second.GetName().AsCString(), + i->first->GetFileSpec().GetFilename().GetCString()); - FindExternalVisibleDecls(context, i->first, i->second, current_id); + FindExternalVisibleDecls(context, i->first, i->second, current_id); + } } + } else if (isa(context.m_decl_context)) { CompilerDeclContext namespace_decl; @@ -768,7 +770,7 @@ current_id); } - ClangASTSource::FindExternalVisibleDecls(context); + return ClangASTSource::FindExternalVisibleDecls(context); } void ClangExpressionDeclMap::FindExternalVisibleDecls(