1 | // Test lldb is able to compute the fully qualified names on templates with |
2 | // -gsimple-template-names and -fdebug-types-section. |
3 | |
4 | // REQUIRES: lld |
5 | |
6 | // Test against logging to see if we print the fully qualified names correctly. |
7 | // RUN: %clangxx --target=x86_64-pc-linux -g -gsimple-template-names %s -c -o %t1.o |
8 | // RUN: ld.lld %t1.o -o %t1 |
9 | // RUN: %lldb %t1 -o "log enable dwarf comp" -o "target variable v3" -o exit | FileCheck %s --check-prefix=LOG |
10 | |
11 | // Test that we following DW_AT_signature correctly. If not, lldb might confuse the types of v1 and v2. |
12 | // RUN: %clangxx --target=x86_64-pc-linux -g -gsimple-template-names -fdebug-types-section %s -c -o %t2.o |
13 | // RUN: ld.lld %t2.o -o %t2 |
14 | // RUN: %lldb %t2 -o "target variable v1 v2" \ |
15 | // RUN: -o "type lookup t2<outer_struct1>" -o "type lookup t2<outer_struct2>" \ |
16 | // RUN: -o exit | FileCheck %s --check-prefix=TYPE |
17 | |
18 | // LOG: unique name: t3<t2<int> >::t4 |
19 | |
20 | // TYPE-LABEL: target variable v1 v2 |
21 | // TYPE: (t2<outer_struct1::t1<int> >) v1 = {} |
22 | // TYPE: (t2<outer_struct2::t1<int> >) v2 = {} |
23 | |
24 | // TYPE-LABEL: type lookup t2<outer_struct1> |
25 | // TYPE: template<> struct t2<outer_struct1> { |
26 | // TYPE-NEXT: } |
27 | |
28 | // TYPE-LABEL: type lookup t2<outer_struct2> |
29 | // TYPE: template<> struct t2<outer_struct2> { |
30 | // TYPE-NEXT: } |
31 | |
32 | struct outer_struct1 { |
33 | template <typename> struct t1 {}; |
34 | }; |
35 | |
36 | struct outer_struct2 { |
37 | template <typename> struct t1 {}; |
38 | }; |
39 | |
40 | template <typename> struct t2 {}; |
41 | t2<outer_struct1::t1<int>> v1; |
42 | t2<outer_struct2::t1<int>> v2; |
43 | |
44 | t2<outer_struct1> v1_1; |
45 | t2<outer_struct2> v1_2; |
46 | |
47 | template <typename> struct t3 { |
48 | struct t4 {}; |
49 | }; |
50 | t3<t2<int>>::t4 v3; |
51 | |