https://github.com/Michael137 created 
https://github.com/llvm/llvm-project/pull/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.

>From 902a6567d4c34790070a717ca31bd8fa0ee01c45 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuc...@gmail.com>
Date: Fri, 6 Jun 2025 10:26:17 +0100
Subject: [PATCH] [lldb][Modules] Make decls from submodules visible for name
 lookup

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.
---
 .../Clang/ClangModulesDeclVendor.cpp                 |  7 +++++++
 .../cpp/decl-from-submodule/TestDeclFromSubmodule.py | 12 ++----------
 2 files changed, 9 insertions(+), 10 deletions(-)

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..26ef12adf139a 100644
--- a/lldb/test/API/lang/cpp/decl-from-submodule/TestDeclFromSubmodule.py
+++ b/lldb/test/API/lang/cpp/decl-from-submodule/TestDeclFromSubmodule.py
@@ -15,13 +15,5 @@ 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