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