Skip to content

Commit ae4e14a

Browse files
authored
Merge pull request #6199 from Michael137/bugfix/lldb-inline-namespace-lookup-to-20221013
[cherry-pick][stable/20221013] [lldb][SymbolFileDWARF] Support by-name lookup of global variables in inline namespaces
2 parents a96195e + 76f67ef commit ae4e14a

File tree

3 files changed

+58
-2
lines changed

3 files changed

+58
-2
lines changed

lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2242,8 +2242,14 @@ void SymbolFileDWARF::FindGlobalVariables(
22422242
if (DWARFASTParser *dwarf_ast = GetDWARFParser(*die.GetCU())) {
22432243
CompilerDeclContext actual_parent_decl_ctx =
22442244
dwarf_ast->GetDeclContextContainingUIDFromDWARF(die);
2245+
2246+
/// If the actual namespace is inline (i.e., had a DW_AT_export_symbols)
2247+
/// and a child (possibly through other layers of inline namespaces)
2248+
/// of the namespace referred to by 'basename', allow the lookup to
2249+
/// succeed.
22452250
if (!actual_parent_decl_ctx ||
2246-
actual_parent_decl_ctx != parent_decl_ctx)
2251+
(actual_parent_decl_ctx != parent_decl_ctx &&
2252+
!parent_decl_ctx.IsContainedInLookup(actual_parent_decl_ctx)))
22472253
return true;
22482254
}
22492255
}

lldb/test/API/commands/expression/inline-namespace/TestInlineNamespace.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,35 @@ def test(self):
2323
# But we should still find the function when we pretend the inline
2424
# namespace is not inline.
2525
self.expect_expr("A::B::f()", result_type="int", result_value="3")
26+
27+
self.expect_expr("A::B::global_var", result_type="int", result_value="0")
28+
# FIXME: should be ambiguous lookup but ClangExpressionDeclMap takes
29+
# first global variable that the lookup found, which in this case
30+
# is A::B::global_var
31+
self.expect_expr("A::global_var", result_type="int", result_value="0")
32+
33+
self.expect_expr("A::B::C::global_var", result_type="int", result_value="1")
34+
self.expect_expr("A::C::global_var", result_type="int", result_value="1")
35+
36+
self.expect_expr("A::B::D::nested_var", result_type="int", result_value="2")
37+
self.expect_expr("A::D::nested_var", result_type="int", result_value="2")
38+
self.expect_expr("A::B::nested_var", result_type="int", result_value="2")
39+
self.expect_expr("A::nested_var", result_type="int", result_value="2")
40+
41+
self.expect_expr("A::E::F::other_var", result_type="int", result_value="3")
42+
self.expect_expr("A::E::other_var", result_type="int", result_value="3")
43+
44+
self.expect("expr A::E::global_var", error=True, substrs=["no member named 'global_var' in namespace 'A::E'"])
45+
self.expect("expr A::E::F::global_var", error=True, substrs=["no member named 'global_var' in namespace 'A::E::F'"])
46+
47+
self.expect("expr A::other_var", error=True, substrs=["no member named 'other_var' in namespace 'A'"])
48+
self.expect("expr A::B::other_var", error=True, substrs=["no member named 'other_var' in namespace 'A::B'"])
49+
self.expect("expr B::other_var", error=True, substrs=["no member named 'other_var' in namespace 'A::B'"])
50+
51+
# 'frame variable' can correctly distinguish between A::B::global_var and A::global_var
52+
gvars = self.target().FindGlobalVariables("A::global_var", 10)
53+
self.assertEqual(len(gvars), 1)
54+
self.assertEqual(gvars[0].GetValueAsSigned(), 4)
55+
56+
self.expect("frame variable A::global_var", substrs=["(int) A::global_var = 4"])
57+
self.expect("frame variable A::B::global_var", substrs=["(int) A::B::global_var = 0"])
Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,28 @@
11
namespace A {
22
inline namespace B {
33
int f() { return 3; }
4+
int global_var = 0;
5+
6+
namespace C {
7+
int global_var = 1;
8+
}
9+
10+
inline namespace D {
11+
int nested_var = 2;
12+
}
413
};
14+
15+
namespace E {
16+
inline namespace F {
17+
int other_var = 3;
18+
}
19+
} // namespace E
20+
21+
int global_var = 4;
522
}
623

724
int main(int argc, char **argv) {
825
// Set break point at this line.
9-
return A::f();
26+
return A::f() + A::B::global_var + A::C::global_var + A::E::F::other_var +
27+
A::B::D::nested_var;
1028
}

0 commit comments

Comments
 (0)