1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -emit-llvm -triple %itanium_abi_triple -g %s -o - -fno-standalone-debug | FileCheck %s 2651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 3651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// Run again with -gline-tables-only and verify we don't crash. We won't output 4651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// type info at all. 5651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -emit-llvm -triple %itanium_abi_triple -g %s -o - -gline-tables-only | FileCheck %s -check-prefix LINES-ONLY 6651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 7651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// LINES-ONLY-NOT: DW_TAG_structure_type 8651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 9651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate <typename T> 10651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct a { 11651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 12651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesextern template class a<int>; 13651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NOT: ; [ DW_TAG_structure_type ] [a<int>] 14651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 15651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate <typename T> 16651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct b { 17651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 18651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesextern template class b<int>; 19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesb<int> bi; 20651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: ; [ DW_TAG_structure_type ] [b<int>] {{.*}} [def] 21651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate <typename T> 23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct c { 24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void f() {} 25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 26651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesextern template class c<int>; 27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesc<int> ci; 28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: ; [ DW_TAG_structure_type ] [c<int>] {{.*}} [decl] 29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate <typename T> 31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct d { 32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void f(); 33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 34651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesextern template class d<int>; 35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesd<int> di; 36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: ; [ DW_TAG_structure_type ] [d<int>] {{.*}} [def] 37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate <typename T> 39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct e { 40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void f(); 41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate <typename T> 43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid e<T>::f() { 44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesextern template class e<int>; 46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinese<int> ei; 47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// There's no guarantee that the out of line definition will appear before the 48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// explicit template instantiation definition, so conservatively emit the type 49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// definition here. 50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: ; [ DW_TAG_structure_type ] [e<int>] {{.*}} [def] 51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate <typename T> 53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct f { 54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void g(); 55651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 56651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesextern template class f<int>; 57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate <typename T> 58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid f<T>::g() { 59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 60651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesf<int> fi; 61651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: ; [ DW_TAG_structure_type ] [f<int>] {{.*}} [def] 62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 63651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate <typename T> 64651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct g { 65651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void f(); 66651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate <> 68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid g<int>::f(); 69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesextern template class g<int>; 70651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesg<int> gi; 71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: ; [ DW_TAG_structure_type ] [g<int>] {{.*}} [def] 72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate <typename T> 74651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct h { 75651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 76651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate class h<int>; 77651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: ; [ DW_TAG_structure_type ] [h<int>] {{.*}} [def] 78651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 79651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate <typename T> 80651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct i { 81651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void f() {} 82651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 83651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<> void i<int>::f(); 84651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesextern template class i<int>; 85651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesi<int> ii; 86651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: ; [ DW_TAG_structure_type ] [i<int>] {{.*}} [def] 87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate <typename T1, typename T2 = T1> 89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct j { 90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesextern template class j<int>; 92651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesj<int> jj; 93651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: ; [ DW_TAG_structure_type ] [j<int, int>] 94