// RUN: %clang_cc1 -emit-llvm -triple %itanium_abi_triple -g %s -o - -fno-standalone-debug | FileCheck %s // Run again with -gline-tables-only and verify we don't crash. We won't output // type info at all. // RUN: %clang_cc1 -emit-llvm -triple %itanium_abi_triple -g %s -o - -gline-tables-only | FileCheck %s -check-prefix LINES-ONLY // LINES-ONLY-NOT: DW_TAG_structure_type template <typename T> struct a { }; extern template class a<int>; // CHECK-NOT: ; [ DW_TAG_structure_type ] [a<int>] template <typename T> struct b { }; extern template class b<int>; b<int> bi; // CHECK: ; [ DW_TAG_structure_type ] [b<int>] {{.*}} [def] template <typename T> struct c { void f() {} }; extern template class c<int>; c<int> ci; // CHECK: ; [ DW_TAG_structure_type ] [c<int>] {{.*}} [decl] template <typename T> struct d { void f(); }; extern template class d<int>; d<int> di; // CHECK: ; [ DW_TAG_structure_type ] [d<int>] {{.*}} [def] template <typename T> struct e { void f(); }; template <typename T> void e<T>::f() { } extern template class e<int>; e<int> ei; // There's no guarantee that the out of line definition will appear before the // explicit template instantiation definition, so conservatively emit the type // definition here. // CHECK: ; [ DW_TAG_structure_type ] [e<int>] {{.*}} [def] template <typename T> struct f { void g(); }; extern template class f<int>; template <typename T> void f<T>::g() { } f<int> fi; // CHECK: ; [ DW_TAG_structure_type ] [f<int>] {{.*}} [def] template <typename T> struct g { void f(); }; template <> void g<int>::f(); extern template class g<int>; g<int> gi; // CHECK: ; [ DW_TAG_structure_type ] [g<int>] {{.*}} [def] template <typename T> struct h { }; template class h<int>; // CHECK: ; [ DW_TAG_structure_type ] [h<int>] {{.*}} [def] template <typename T> struct i { void f() {} }; template<> void i<int>::f(); extern template class i<int>; i<int> ii; // CHECK: ; [ DW_TAG_structure_type ] [i<int>] {{.*}} [def] template <typename T1, typename T2 = T1> struct j { }; extern template class j<int>; j<int> jj; // CHECK: ; [ DW_TAG_structure_type ] [j<int, int>]