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