1 // RUN: %clang_cc1 -emit-llvm -triple %itanium_abi_triple -debug-info-kind=limited %s -o - | FileCheck %s 2 3 // Run again with -gline-tables-only and verify we don't crash. We won't output 4 // type info at all. 5 // RUN: %clang_cc1 -emit-llvm -triple %itanium_abi_triple -debug-info-kind=line-tables-only %s -o - | FileCheck %s -check-prefix LINES-ONLY 6 7 // LINES-ONLY-NOT: !DICompositeType(tag: DW_TAG_structure_type 8 9 // "h" is at the top because it's in the compile unit's retainedTypes: list. 10 // CHECK: DICompositeType(tag: DW_TAG_structure_type, name: "h<int>" 11 // CHECK-NOT: DIFlagFwdDecl 12 // CHECK-SAME: ){{$}} 13 14 template <typename T> 15 struct a { 16 }; 17 extern template class a<int>; 18 // CHECK-NOT: DICompositeType(tag: DW_TAG_structure_type, name: "a<int>" 19 20 template <typename T> 21 struct b { 22 }; 23 extern template class b<int>; 24 b<int> bi; 25 // CHECK: DICompositeType(tag: DW_TAG_structure_type, name: "b<int>" 26 // CHECK-NOT: DIFlagFwdDecl 27 // CHECK-SAME: ){{$}} 28 29 template <typename T> 30 struct c { 31 void f() {} 32 }; 33 extern template class c<int>; 34 c<int> ci; 35 // CHECK: DICompositeType(tag: DW_TAG_structure_type, name: "c<int>" 36 // CHECK-SAME: DIFlagFwdDecl 37 38 template <typename T> 39 struct d { 40 void f(); 41 }; 42 extern template class d<int>; 43 d<int> di; 44 // CHECK: DICompositeType(tag: DW_TAG_structure_type, name: "d<int>" 45 // CHECK-NOT: DIFlagFwdDecl 46 // CHECK-SAME: ){{$}} 47 48 template <typename T> 49 struct e { 50 void f(); 51 }; 52 template <typename T> 53 void e<T>::f() { 54 } 55 extern template class e<int>; 56 e<int> ei; 57 // There's no guarantee that the out of line definition will appear before the 58 // explicit template instantiation definition, so conservatively emit the type 59 // definition here. 60 // CHECK: DICompositeType(tag: DW_TAG_structure_type, name: "e<int>" 61 // CHECK-NOT: DIFlagFwdDecl 62 // CHECK-SAME: ){{$}} 63 64 template <typename T> 65 struct f { 66 void g(); 67 }; 68 extern template class f<int>; 69 template <typename T> 70 void f<T>::g() { 71 } 72 f<int> fi; 73 // CHECK: DICompositeType(tag: DW_TAG_structure_type, name: "f<int>" 74 // CHECK-NOT: DIFlagFwdDecl 75 // CHECK-SAME: ){{$}} 76 77 template <typename T> 78 struct g { 79 void f(); 80 }; 81 template <> 82 void g<int>::f(); 83 extern template class g<int>; 84 g<int> gi; 85 // CHECK: DICompositeType(tag: DW_TAG_structure_type, name: "g<int>" 86 // CHECK-NOT: DIFlagFwdDecl 87 // CHECK-SAME: ){{$}} 88 89 template <typename T> 90 struct h { 91 }; 92 template class h<int>; 93 94 template <typename T> 95 struct i { 96 void f() {} 97 }; 98 template<> void i<int>::f(); 99 extern template class i<int>; 100 i<int> ii; 101 // CHECK: DICompositeType(tag: DW_TAG_structure_type, name: "i<int>" 102 // CHECK-NOT: DIFlagFwdDecl 103 // CHECK-SAME: ){{$}} 104 105 template <typename T1, typename T2 = T1> 106 struct j { 107 }; 108 extern template class j<int>; 109 j<int> jj; 110 // CHECK: DICompositeType(tag: DW_TAG_structure_type, name: "j<int, int>" 111 112 template <typename T> 113 struct k { 114 }; 115 template <> 116 struct k<int>; 117 template struct k<int>; 118 // CHECK-NOT: !DICompositeType(tag: DW_TAG_structure_type, name: "k<int>" 119