|
| 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