1*67e74705SXin Li // RUN: rm -rf %t
2*67e74705SXin Li // Test that only forward declarations are emitted for types dfined in modules.
3*67e74705SXin Li
4*67e74705SXin Li // Modules:
5*67e74705SXin Li // RUN: %clang_cc1 -x objective-c++ -std=c++11 -debug-info-kind=standalone \
6*67e74705SXin Li // RUN: -dwarf-ext-refs -fmodules \
7*67e74705SXin Li // RUN: -fmodule-format=obj -fimplicit-module-maps -DMODULES \
8*67e74705SXin Li // RUN: -triple %itanium_abi_triple \
9*67e74705SXin Li // RUN: -fmodules-cache-path=%t %s -I %S/Inputs -I %t -emit-llvm -o %t-mod.ll
10*67e74705SXin Li // RUN: cat %t-mod.ll | FileCheck %s
11*67e74705SXin Li
12*67e74705SXin Li // PCH:
13*67e74705SXin Li // RUN: %clang_cc1 -x c++ -std=c++11 -fmodule-format=obj -emit-pch -I%S/Inputs \
14*67e74705SXin Li // RUN: -triple %itanium_abi_triple \
15*67e74705SXin Li // RUN: -o %t.pch %S/Inputs/DebugCXX.h
16*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -debug-info-kind=standalone \
17*67e74705SXin Li // RUN: -dwarf-ext-refs -fmodule-format=obj \
18*67e74705SXin Li // RUN: -triple %itanium_abi_triple \
19*67e74705SXin Li // RUN: -include-pch %t.pch %s -emit-llvm -o %t-pch.ll %s
20*67e74705SXin Li // RUN: cat %t-pch.ll | FileCheck %s
21*67e74705SXin Li // RUN: cat %t-pch.ll | FileCheck %s --check-prefix=CHECK-PCH
22*67e74705SXin Li
23*67e74705SXin Li #ifdef MODULES
24*67e74705SXin Li @import DebugCXX;
25*67e74705SXin Li #endif
26*67e74705SXin Li
27*67e74705SXin Li using DebugCXX::Struct;
28*67e74705SXin Li
29*67e74705SXin Li Struct s;
30*67e74705SXin Li DebugCXX::Enum e;
31*67e74705SXin Li
32*67e74705SXin Li // Template instantiations.
33*67e74705SXin Li DebugCXX::Template<long> implicitTemplate;
34*67e74705SXin Li DebugCXX::Template<int> explicitTemplate;
35*67e74705SXin Li DebugCXX::FloatInstantiation typedefTemplate;
36*67e74705SXin Li DebugCXX::B anchoredTemplate;
37*67e74705SXin Li
38*67e74705SXin Li int Struct::static_member = -1;
39*67e74705SXin Li enum {
40*67e74705SXin Li e3 = -1
41*67e74705SXin Li } conflicting_uid = e3;
42*67e74705SXin Li auto anon_enum = DebugCXX::e2;
43*67e74705SXin Li char _anchor = anon_enum + conflicting_uid;
44*67e74705SXin Li
45*67e74705SXin Li TypedefUnion tdu;
46*67e74705SXin Li TypedefEnum tde;
47*67e74705SXin Li TypedefStruct tds;
48*67e74705SXin Li TypedefTemplate tdt;
49*67e74705SXin Li Template1<int> explicitTemplate1;
50*67e74705SXin Li
51*67e74705SXin Li template <class T> class FwdDeclTemplate { T t; };
52*67e74705SXin Li TypedefFwdDeclTemplate tdfdt;
53*67e74705SXin Li
54*67e74705SXin Li InAnonymousNamespace anon;
55*67e74705SXin Li
56*67e74705SXin Li // Types that are forward-declared in the module and defined here.
57*67e74705SXin Li struct PureFwdDecl { int i; };
58*67e74705SXin Li PureFwdDecl definedLocally;
59*67e74705SXin Li
60*67e74705SXin Li struct Specialized<int>::Member { int i; };
61*67e74705SXin Li struct Specialized<int>::Member definedLocally2;
62*67e74705SXin Li
63*67e74705SXin Li template <class T> struct FwdDeclTemplateMember<T>::Member { T t; };
64*67e74705SXin Li TypedefFwdDeclTemplateMember tdfdtm;
65*67e74705SXin Li
foo()66*67e74705SXin Li void foo() {
67*67e74705SXin Li anon.i = GlobalStruct.i = GlobalUnion.i = GlobalEnum;
68*67e74705SXin Li }
69*67e74705SXin Li
70*67e74705SXin Li
71*67e74705SXin Li // CHECK: ![[STRUCT:.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "Struct",
72*67e74705SXin Li // CHECK-SAME: scope: ![[NS:[0-9]+]],
73*67e74705SXin Li // CHECK-SAME: flags: DIFlagFwdDecl,
74*67e74705SXin Li // CHECK-SAME: identifier: "_ZTSN8DebugCXX6StructE")
75*67e74705SXin Li
76*67e74705SXin Li // CHECK: ![[NS]] = !DINamespace(name: "DebugCXX", scope: ![[MOD:[0-9]+]],
77*67e74705SXin Li // CHECK: ![[MOD]] = !DIModule(scope: null, name: {{.*}}DebugCXX
78*67e74705SXin Li
79*67e74705SXin Li // CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "Enum",
80*67e74705SXin Li // CHECK-SAME: scope: ![[NS]],
81*67e74705SXin Li // CHECK-SAME: flags: DIFlagFwdDecl,
82*67e74705SXin Li // CHECK-SAME: identifier: "_ZTSN8DebugCXX4EnumE")
83*67e74705SXin Li
84*67e74705SXin Li // This type is anchored in the module by an explicit template instantiation.
85*67e74705SXin Li // CHECK: !DICompositeType(tag: DW_TAG_class_type,
86*67e74705SXin Li // CHECK-SAME: name: "Template<long, DebugCXX::traits<long> >",
87*67e74705SXin Li // CHECK-SAME: scope: ![[NS]],
88*67e74705SXin Li // CHECK-SAME: flags: DIFlagFwdDecl,
89*67e74705SXin Li // CHECK-SAME: identifier: "_ZTSN8DebugCXX8TemplateIlNS_6traitsIlEEEE")
90*67e74705SXin Li
91*67e74705SXin Li // This type is anchored in the module by an explicit template instantiation.
92*67e74705SXin Li // CHECK: !DICompositeType(tag: DW_TAG_class_type,
93*67e74705SXin Li // CHECK-SAME: name: "Template<int, DebugCXX::traits<int> >",
94*67e74705SXin Li // CHECK-SAME: scope: ![[NS]],
95*67e74705SXin Li // CHECK-SAME: flags: DIFlagFwdDecl,
96*67e74705SXin Li // CHECK-SAME: identifier: "_ZTSN8DebugCXX8TemplateIiNS_6traitsIiEEEE")
97*67e74705SXin Li
98*67e74705SXin Li // This type isn't, however, even with standalone non-module debug info this
99*67e74705SXin Li // type is a forward declaration.
100*67e74705SXin Li // CHECK-NOT: !DICompositeType(tag: DW_TAG_structure_type, name: "traits<int>",
101*67e74705SXin Li
102*67e74705SXin Li // This one isn't.
103*67e74705SXin Li // CHECK: !DICompositeType(tag: DW_TAG_class_type,
104*67e74705SXin Li // CHECK-SAME: name: "Template<float, DebugCXX::traits<float> >",
105*67e74705SXin Li // CHECK-SAME: scope: ![[NS]],
106*67e74705SXin Li // CHECK-SAME: templateParams:
107*67e74705SXin Li // CHECK-SAME: identifier: "_ZTSN8DebugCXX8TemplateIfNS_6traitsIfEEEE")
108*67e74705SXin Li
109*67e74705SXin Li // This type is anchored in the module by an explicit template instantiation.
110*67e74705SXin Li // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "traits<float>",
111*67e74705SXin Li // CHECK-SAME: flags: DIFlagFwdDecl,
112*67e74705SXin Li // CHECK-SAME: identifier: "_ZTSN8DebugCXX6traitsIfEE")
113*67e74705SXin Li
114*67e74705SXin Li
115*67e74705SXin Li // This type is anchored in the module by an explicit template instantiation.
116*67e74705SXin Li // CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "A<void>",
117*67e74705SXin Li // CHECK-SAME: scope: ![[NS]],
118*67e74705SXin Li // CHECK-SAME: flags: DIFlagFwdDecl,
119*67e74705SXin Li // CHECK-SAME: identifier: "_ZTSN8DebugCXX1AIJvEEE")
120*67e74705SXin Li
121*67e74705SXin Li // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "static_member",
122*67e74705SXin Li // CHECK-SAME: scope: ![[STRUCT]]
123*67e74705SXin Li
124*67e74705SXin Li // CHECK: !DICompositeType(tag: DW_TAG_union_type,
125*67e74705SXin Li // CHECK-SAME: flags: DIFlagFwdDecl,
126*67e74705SXin Li // CHECK-SAME: identifier: "_ZTS12TypedefUnion")
127*67e74705SXin Li // CHECK: !DICompositeType(tag: DW_TAG_enumeration_type,
128*67e74705SXin Li // CHECK-SAME: flags: DIFlagFwdDecl,
129*67e74705SXin Li // CHECK-SAME: identifier: "_ZTS11TypedefEnum")
130*67e74705SXin Li // CHECK: !DICompositeType(tag: DW_TAG_structure_type,
131*67e74705SXin Li // CHECK-SAME: flags: DIFlagFwdDecl,
132*67e74705SXin Li // CHECK-SAME: identifier: "_ZTS13TypedefStruct")
133*67e74705SXin Li
134*67e74705SXin Li // This one isn't.
135*67e74705SXin Li // CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "Template1<void *>",
136*67e74705SXin Li // CHECK-SAME: templateParams:
137*67e74705SXin Li // CHECK-SAME: identifier: "_ZTS9Template1IPvE")
138*67e74705SXin Li
139*67e74705SXin Li // This type is anchored in the module by an explicit template instantiation.
140*67e74705SXin Li // CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "Template1<int>",
141*67e74705SXin Li // CHECK-SAME: flags: DIFlagFwdDecl,
142*67e74705SXin Li // CHECK-SAME: identifier: "_ZTS9Template1IiE")
143*67e74705SXin Li
144*67e74705SXin Li // CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "FwdDeclTemplate<int>",
145*67e74705SXin Li // CHECK-SAME: templateParams:
146*67e74705SXin Li // CHECK-SAME: identifier: "_ZTS15FwdDeclTemplateIiE")
147*67e74705SXin Li
148*67e74705SXin Li // This type is defined locally and forward-declared in the module.
149*67e74705SXin Li // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "PureFwdDecl",
150*67e74705SXin Li // CHECK-SAME: elements:
151*67e74705SXin Li // CHECK-SAME: identifier: "_ZTS11PureFwdDecl")
152*67e74705SXin Li
153*67e74705SXin Li // This type is defined locally and forward-declared in the module.
154*67e74705SXin Li // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "Member",
155*67e74705SXin Li // CHECK-SAME: elements:
156*67e74705SXin Li // CHECK-SAME: identifier: "_ZTSN11SpecializedIiE6MemberE")
157*67e74705SXin Li
158*67e74705SXin Li // This type is defined locally and forward-declared in the module.
159*67e74705SXin Li // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "Member",
160*67e74705SXin Li // CHECK-SAME: elements:
161*67e74705SXin Li // CHECK-SAME: identifier: "_ZTSN21FwdDeclTemplateMemberIiE6MemberE")
162*67e74705SXin Li
163*67e74705SXin Li
164*67e74705SXin Li // CHECK: !DIGlobalVariable(name: "anon_enum", {{.*}}, type: ![[ANON_ENUM:[0-9]+]]
165*67e74705SXin Li // CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, scope: ![[NS]],
166*67e74705SXin Li // CHECK-SAME: line: 16
167*67e74705SXin Li
168*67e74705SXin Li // CHECK: !DIGlobalVariable(name: "GlobalUnion",
169*67e74705SXin Li // CHECK-SAME: type: ![[GLOBAL_UNION:[0-9]+]]
170*67e74705SXin Li // CHECK: ![[GLOBAL_UNION]] = distinct !DICompositeType(tag: DW_TAG_union_type,
171*67e74705SXin Li // CHECK-SAME: elements: !{{[0-9]+}})
172*67e74705SXin Li // CHECK: !DIGlobalVariable(name: "GlobalStruct",
173*67e74705SXin Li // CHECK-SAME: type: ![[GLOBAL_STRUCT:[0-9]+]]
174*67e74705SXin Li // CHECK: ![[GLOBAL_STRUCT]] = distinct !DICompositeType(tag: DW_TAG_structure_type,
175*67e74705SXin Li // CHECK-SAME: elements: !{{[0-9]+}})
176*67e74705SXin Li
177*67e74705SXin Li
178*67e74705SXin Li // CHECK: !DIGlobalVariable(name: "anon",
179*67e74705SXin Li // CHECK-SAME: type: ![[GLOBAL_ANON:[0-9]+]]
180*67e74705SXin Li // CHECK: ![[GLOBAL_ANON]] = !DICompositeType(tag: DW_TAG_structure_type,
181*67e74705SXin Li // CHECK-SAME: name: "InAnonymousNamespace", {{.*}}DIFlagFwdDecl)
182*67e74705SXin Li
183*67e74705SXin Li
184*67e74705SXin Li // CHECK: !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: !0, entity: ![[STRUCT]], line: 27)
185*67e74705SXin Li
186*67e74705SXin Li // CHECK: !DICompileUnit(
187*67e74705SXin Li // CHECK-SAME: splitDebugFilename:
188*67e74705SXin Li // CHECK-SAME: dwoId:
189*67e74705SXin Li // CHECK-PCH: !DICompileUnit({{.*}}splitDebugFilename:
190*67e74705SXin Li // CHECK-PCH: dwoId: 18446744073709551614
191