Skip to content

Commit 3c7bf3b

Browse files
authored
[LLDB][NativePDB] Complete array member types in AST builder (#156370)
1 parent f0df1e3 commit 3c7bf3b

File tree

4 files changed

+115
-45
lines changed

4 files changed

+115
-45
lines changed

lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1169,6 +1169,7 @@ clang::QualType PdbAstBuilder::CreateEnumType(PdbTypeSymId id,
11691169

11701170
clang::QualType PdbAstBuilder::CreateArrayType(const ArrayRecord &ar) {
11711171
clang::QualType element_type = GetOrCreateType(ar.ElementType);
1172+
TypeSystemClang::RequireCompleteType(ToCompilerType(element_type));
11721173

11731174
SymbolFileNativePDB *pdb = static_cast<SymbolFileNativePDB *>(
11741175
m_clang.GetSymbolFile()->GetBackingSymbolFile());

lldb/test/Shell/SymbolFile/NativePDB/Inputs/incomplete-tag-type.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,8 @@ struct E {
1313
E();
1414
};
1515
E::E() = default;
16+
17+
struct I {
18+
I();
19+
};
20+
I::I() = default;

lldb/test/Shell/SymbolFile/NativePDB/incomplete-tag-type.cpp

Lines changed: 0 additions & 45 deletions
This file was deleted.
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
# REQUIRES: lld, x86
2+
3+
# RUN: split-file %s %t
4+
5+
# RUN: %clang_cl --target=x86_64-windows-msvc -c /Fo%t1.obj -- %p/Inputs/incomplete-tag-type.cpp
6+
# RUN: %clang_cl --target=x86_64-windows-msvc /O1 /Z7 -c /Fo%t2.obj -- %t/main.cpp
7+
# RUN: lld-link /debug:full /nodefaultlib /entry:main %t1.obj %t2.obj /out:%t.exe /pdb:%t.pdb
8+
9+
# RUN: %lldb -f %t.exe -s %t/target-var.input 2>&1 | FileCheck %s --check-prefix=TARGET-VAR
10+
# RUN: %lldb -f %t.exe -s %t/expr.input 2>&1 | FileCheck %s --check-prefix=EXPR
11+
12+
#--- main.cpp
13+
14+
// Complete base class.
15+
struct A { int x; A(); };
16+
struct B : A {};
17+
B b;
18+
19+
// Complete data member.
20+
struct C {
21+
C();
22+
};
23+
24+
struct D {
25+
C c;
26+
};
27+
D d;
28+
29+
// Incomplete static data member should return error.
30+
struct E {
31+
E();
32+
};
33+
34+
struct F {
35+
static E static_e;
36+
};
37+
38+
E F::static_e = E();
39+
E& static_e_ref = F::static_e;
40+
41+
struct G {
42+
int foo = 1;
43+
};
44+
struct H {
45+
G g[2];
46+
};
47+
H h;
48+
49+
struct I {
50+
I();
51+
};
52+
struct J {
53+
I i[2];
54+
};
55+
J j;
56+
57+
58+
int main(){}
59+
60+
#--- target-var.input
61+
62+
target variable b
63+
target variable d
64+
target variable h
65+
target variable j
66+
target variable static_e_ref
67+
exit
68+
69+
#--- expr.input
70+
71+
settings set interpreter.stop-command-source-on-error false
72+
expression b
73+
expression d
74+
expression h
75+
expression j
76+
expression static_e_ref
77+
exit
78+
79+
# TARGET-VAR: (lldb) target variable b
80+
# TARGET-VAR-NEXT: (B) b = (A = <incomplete type>)
81+
# TARGET-VAR-NEXT: (lldb) target variable d
82+
# TARGET-VAR-NEXT: (D) d = {}
83+
# TARGET-VAR-NEXT: (lldb) target variable h
84+
# TARGET-VAR-NEXT: (H) h = {
85+
# TARGET-VAR-NEXT: g = {
86+
# TARGET-VAR-NEXT: [0] = (foo = 1)
87+
# TARGET-VAR-NEXT: [1] = (foo = 1)
88+
# TARGET-VAR-NEXT: }
89+
# TARGET-VAR-NEXT: }
90+
# TARGET-VAR-NEXT: (lldb) target variable j
91+
# TARGET-VAR-NEXT: (J) j = {}
92+
# TARGET-VAR-NEXT: (lldb) target variable static_e_ref
93+
# TARGET-VAR-NEXT: (E &) static_e_ref = 0x{{.*}} <incomplete type "E">
94+
95+
# EXPR: (lldb) expression b
96+
# EXPR-NEXT: (B) $0 = {}
97+
# EXPR-NEXT: (lldb) expression d
98+
# EXPR-NEXT: (D) $1 = {}
99+
# EXPR-NEXT: (lldb) expression h
100+
# EXPR-NEXT: (H) $2 = {
101+
# EXPR-NEXT: g = {
102+
# EXPR-NEXT: [0] = (foo = 1)
103+
# EXPR-NEXT: [1] = (foo = 1)
104+
# EXPR-NEXT: }
105+
# EXPR-NEXT: }
106+
# EXPR-NEXT: (lldb) expression j
107+
# EXPR-NEXT: (J) $3 = {}
108+
# EXPR-NEXT: (lldb) expression static_e_ref
109+
# EXPR: error:{{.*}}incomplete type 'E' where a complete type is required

0 commit comments

Comments
 (0)