Author: Michael Buch
Date: 2025-06-06T17:17:00+01:00
New Revision: 30f524090542d07067234c292c15d4a4129b4aea

URL: 
https://github.com/llvm/llvm-project/commit/30f524090542d07067234c292c15d4a4129b4aea
DIFF: 
https://github.com/llvm/llvm-project/commit/30f524090542d07067234c292c15d4a4129b4aea.diff

LOG: [lldb][Modules] Make decls from submodules visible for name lookup 
(#143098)

This patch ensures we can find decls in submodules during expression
evaluation. Previously, submodules would have all their decls marked as
`Hidden`. When Clang asked LLDB for decls, it would see them in the
submodule but `clang::Sema` would reject them because they weren't
`Visible` (specifically, `getAcceptableDecl` would fail during
`CppNameLookup`). Here we just mark the submodule as visible to work
around this problem.

Added: 
    

Modified: 
    lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.cpp
    lldb/test/API/lang/cpp/decl-from-submodule/TestDeclFromSubmodule.py

Removed: 
    


################################################################################
diff  --git 
a/lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.cpp 
b/lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.cpp
index c99ed9dd0a68d..284e5bc6fb1e5 100644
--- a/lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.cpp
+++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.cpp
@@ -382,6 +382,13 @@ bool ClangModulesDeclVendorImpl::AddModule(const 
SourceModule &module,
     }
   }
 
+  // If we didn't make the submodule visible here, Clang wouldn't allow LLDB to
+  // pick any of the decls in the submodules during C++ name lookup.
+  if (submodule)
+    m_compiler_instance->makeModuleVisible(
+        submodule, clang::Module::NameVisibilityKind::AllVisible,
+        /*ImportLoc=*/{});
+
   clang::Module *requested_module = DoGetModule(clang_path, true);
 
   if (requested_module != nullptr) {

diff  --git 
a/lldb/test/API/lang/cpp/decl-from-submodule/TestDeclFromSubmodule.py 
b/lldb/test/API/lang/cpp/decl-from-submodule/TestDeclFromSubmodule.py
index f200e51c7f794..d044ad46637fe 100644
--- a/lldb/test/API/lang/cpp/decl-from-submodule/TestDeclFromSubmodule.py
+++ b/lldb/test/API/lang/cpp/decl-from-submodule/TestDeclFromSubmodule.py
@@ -11,17 +11,11 @@
 class DeclFromSubmoduleTestCase(TestBase):
     # Requires DWARF debug info which is not retained when linking with 
link.exe.
     @skipIfWindows
+    # Lookup for decls in submodules fails in Linux
+    @expectedFailureAll(oslist=["linux"])
     def test_expr(self):
         self.build()
         lldbutil.run_to_source_breakpoint(self, "return 0", 
lldb.SBFileSpec("main.cpp"))
 
-        # FIXME: LLDB finds the decl for 'func' in the submodules correctly 
and hands it to Clang
-        # but Sema rejects using the decl during name lookup because it is not 
marked "Visible".
-        # However, this assertions still ensures that we at least don't fail 
to compile the
-        # submodule (which would cause other errors to appear before the 
expression error, hence
-        # we use "startstr").
-        self.expect(
-            "expr func(1, 2)",
-            error=True,
-            startstr="error: <user expression 0>:1:1: 'func' has unknown 
return type",
-        )
+        self.expect_expr("func(1, 2)", result_type="int", result_value="3")
+        self.expect_expr("func(1)", result_type="int", result_value="1")


        
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to