1*22f01cd4SJake Egan // UNSUPPORTED: -zos, -aix
25c8bd88aSAdrian Prantl // RUN: rm -rf %t
35e304906SAdrian Prantl // Test that only forward declarations are emitted for types defined in modules.
45c8bd88aSAdrian Prantl 
55c8bd88aSAdrian Prantl // Modules:
605fefa4aSAdrian Prantl // RUN: %clang_cc1 -x objective-c++ -std=c++11 -debug-info-kind=standalone \
7e1c2ad8aSAdrian Prantl // RUN:     -dwarf-ext-refs -fmodules                                   \
85c8bd88aSAdrian Prantl // RUN:     -fmodule-format=obj -fimplicit-module-maps -DMODULES \
9854a2b7fSReid Kleckner // RUN:     -triple %itanium_abi_triple \
105c8bd88aSAdrian Prantl // RUN:     -fmodules-cache-path=%t %s -I %S/Inputs -I %t -emit-llvm -o %t-mod.ll
115c8bd88aSAdrian Prantl // RUN: cat %t-mod.ll |  FileCheck %s
125c8bd88aSAdrian Prantl 
135c8bd88aSAdrian Prantl // PCH:
145c8bd88aSAdrian Prantl // RUN: %clang_cc1 -x c++ -std=c++11 -fmodule-format=obj -emit-pch -I%S/Inputs \
15854a2b7fSReid Kleckner // RUN:     -triple %itanium_abi_triple \
165c8bd88aSAdrian Prantl // RUN:     -o %t.pch %S/Inputs/DebugCXX.h
1705fefa4aSAdrian Prantl // RUN: %clang_cc1 -std=c++11 -debug-info-kind=standalone \
18e1c2ad8aSAdrian Prantl // RUN:     -dwarf-ext-refs -fmodule-format=obj \
19854a2b7fSReid Kleckner // RUN:     -triple %itanium_abi_triple \
20d57e29f8SAaron Ballman // RUN:     -include-pch %t.pch %s -emit-llvm -o %t-pch.ll
215c8bd88aSAdrian Prantl // RUN: cat %t-pch.ll |  FileCheck %s
22ae108c47SAdrian Prantl // RUN: cat %t-pch.ll |  FileCheck %s --check-prefix=CHECK-PCH
23e1c2ad8aSAdrian Prantl 
245c8bd88aSAdrian Prantl #ifdef MODULES
255c8bd88aSAdrian Prantl @import DebugCXX;
265c8bd88aSAdrian Prantl #endif
275c8bd88aSAdrian Prantl 
2845a73836SJake Egan // Set the line number so that the LIT check expected line number doesn't have to be updated after adding/removing a line in the RUN section.
2945a73836SJake Egan #line 50
305c8bd88aSAdrian Prantl using DebugCXX::Struct;
315c8bd88aSAdrian Prantl 
325c8bd88aSAdrian Prantl Struct s;
335c8bd88aSAdrian Prantl DebugCXX::Enum e;
340dabc2adSAdrian Prantl 
350dabc2adSAdrian Prantl // Template instantiations.
365c8bd88aSAdrian Prantl DebugCXX::Template<long> implicitTemplate;
375c8bd88aSAdrian Prantl DebugCXX::Template<int> explicitTemplate;
3805fefa4aSAdrian Prantl DebugCXX::FloatInstantiation typedefTemplate;
3905fefa4aSAdrian Prantl DebugCXX::B anchoredTemplate;
4005fefa4aSAdrian Prantl 
415c8bd88aSAdrian Prantl int Struct::static_member = -1;
425c8bd88aSAdrian Prantl enum {
435c8bd88aSAdrian Prantl   e3 = -1
445c8bd88aSAdrian Prantl } conflicting_uid = e3;
455c8bd88aSAdrian Prantl auto anon_enum = DebugCXX::e2;
465c8bd88aSAdrian Prantl char _anchor = anon_enum + conflicting_uid;
475c8bd88aSAdrian Prantl 
48e5238d2aSAdrian Prantl TypedefUnion tdu;
49e5238d2aSAdrian Prantl TypedefEnum tde;
50e5238d2aSAdrian Prantl TypedefStruct tds;
5105fefa4aSAdrian Prantl TypedefTemplate tdt;
5205fefa4aSAdrian Prantl Template1<int> explicitTemplate1;
5305fefa4aSAdrian Prantl 
5405fefa4aSAdrian Prantl template <class T> class FwdDeclTemplate { T t; };
5505fefa4aSAdrian Prantl TypedefFwdDeclTemplate tdfdt;
56e5238d2aSAdrian Prantl 
578f55b66aSAdrian Prantl InAnonymousNamespace anon;
588f55b66aSAdrian Prantl 
590dabc2adSAdrian Prantl // Types that are forward-declared in the module and defined here.
6088d79179SAdrian Prantl struct PureFwdDecl { int i; };
6188d79179SAdrian Prantl PureFwdDecl definedLocally;
6288d79179SAdrian Prantl 
6390931c48SAdrian Prantl struct Specialized<int>::Member { int i; };
6490931c48SAdrian Prantl struct Specialized<int>::Member definedLocally2;
6590931c48SAdrian Prantl 
660dabc2adSAdrian Prantl template <class T> struct FwdDeclTemplateMember<T>::Member { T t; };
670dabc2adSAdrian Prantl TypedefFwdDeclTemplateMember tdfdtm;
680dabc2adSAdrian Prantl 
6926cb1d26SAdrian Prantl SpecializedBase definedLocally3;
7026cb1d26SAdrian Prantl extern template class WithSpecializedBase<int>;
7126cb1d26SAdrian Prantl WithSpecializedBase<int> definedLocally4;
7226cb1d26SAdrian Prantl 
foo()73cd975018SAdrian Prantl void foo() {
748f55b66aSAdrian Prantl   anon.i = GlobalStruct.i = GlobalUnion.i = GlobalEnum;
75a43acdc4SAdrian Prantl   A a;
76a43acdc4SAdrian Prantl   Virtual virt;
77cd975018SAdrian Prantl }
78cd975018SAdrian Prantl 
795649b0e8SAdrian Prantl // CHECK: ![[CPP:.*]] = !DIFile(filename: {{.*}}ExtDebugInfo.cpp"
805649b0e8SAdrian Prantl 
81eeb56abeSPeter Collingbourne // CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "Enum",
82383f8413SDuncan P. N. Exon Smith // CHECK-SAME:             scope: ![[NS:[0-9]+]],
83dace7adaSAmy Huang // CHECK-SAME:             flags: DIFlagFwdDecl
84eeb56abeSPeter Collingbourne // CHECK-SAME:             identifier:  "_ZTSN8DebugCXX4EnumE")
855c8bd88aSAdrian Prantl 
866ee72d74SAdrian Prantl // CHECK: ![[NS]] = !DINamespace(name: "DebugCXX", scope: ![[MOD:[0-9]+]])
87383f8413SDuncan P. N. Exon Smith // CHECK: ![[MOD]] = !DIModule(scope: null, name: {{.*}}DebugCXX
88383f8413SDuncan P. N. Exon Smith 
89ba6fdc57SAdrian Prantl // This type is not anchored in the module by an explicit template instantiation.
9005fefa4aSAdrian Prantl // CHECK: !DICompositeType(tag: DW_TAG_class_type,
9105fefa4aSAdrian Prantl // CHECK-SAME:             name: "Template<long, DebugCXX::traits<long> >",
9205fefa4aSAdrian Prantl // CHECK-SAME:             scope: ![[NS]],
93ba6fdc57SAdrian Prantl // CHECK-SAME:             elements:
9405fefa4aSAdrian Prantl // CHECK-SAME:             identifier: "_ZTSN8DebugCXX8TemplateIlNS_6traitsIlEEEE")
9505fefa4aSAdrian Prantl 
9605fefa4aSAdrian Prantl // This type is anchored in the module by an explicit template instantiation.
9705fefa4aSAdrian Prantl // CHECK: !DICompositeType(tag: DW_TAG_class_type,
9805fefa4aSAdrian Prantl // CHECK-SAME:             name: "Template<int, DebugCXX::traits<int> >",
995c8bd88aSAdrian Prantl // CHECK-SAME:             scope: ![[NS]],
100dace7adaSAmy Huang // CHECK-SAME:             flags: DIFlagFwdDecl
1015c8bd88aSAdrian Prantl // CHECK-SAME:             identifier: "_ZTSN8DebugCXX8TemplateIiNS_6traitsIiEEEE")
1025c8bd88aSAdrian Prantl 
10305fefa4aSAdrian Prantl // This type isn't, however, even with standalone non-module debug info this
10405fefa4aSAdrian Prantl // type is a forward declaration.
10505fefa4aSAdrian Prantl // CHECK-NOT: !DICompositeType(tag: DW_TAG_structure_type, name: "traits<int>",
10605fefa4aSAdrian Prantl 
10705fefa4aSAdrian Prantl // This one isn't.
10805fefa4aSAdrian Prantl // CHECK: !DICompositeType(tag: DW_TAG_class_type,
10905fefa4aSAdrian Prantl // CHECK-SAME:             name: "Template<float, DebugCXX::traits<float> >",
11005fefa4aSAdrian Prantl // CHECK-SAME:             scope: ![[NS]],
11126cb1d26SAdrian Prantl // CHECK-SAME:             elements:
11205fefa4aSAdrian Prantl // CHECK-SAME:             templateParams:
11305fefa4aSAdrian Prantl // CHECK-SAME:             identifier: "_ZTSN8DebugCXX8TemplateIfNS_6traitsIfEEEE")
11405fefa4aSAdrian Prantl 
11505fefa4aSAdrian Prantl // This type is anchored in the module by an explicit template instantiation.
11605fefa4aSAdrian Prantl // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "traits<float>",
117dace7adaSAmy Huang // CHECK-SAME:             flags: DIFlagFwdDecl
11805fefa4aSAdrian Prantl // CHECK-SAME:             identifier: "_ZTSN8DebugCXX6traitsIfEE")
11905fefa4aSAdrian Prantl 
12005fefa4aSAdrian Prantl 
12126cb1d26SAdrian Prantl // This type is anchored in the module via a function argument,
12226cb1d26SAdrian Prantl // but we don't know this (yet).
12305fefa4aSAdrian Prantl // CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "A<void>",
1245c8bd88aSAdrian Prantl // CHECK-SAME:             scope: ![[NS]],
12526cb1d26SAdrian Prantl // CHECK-SAME:             elements:
12605fefa4aSAdrian Prantl // CHECK-SAME:             identifier: "_ZTSN8DebugCXX1AIJvEEE")
1275c8bd88aSAdrian Prantl 
128383f8413SDuncan P. N. Exon Smith // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "static_member",
129eeb56abeSPeter Collingbourne // CHECK-SAME:           scope: ![[STRUCT:[0-9]*]]
130eeb56abeSPeter Collingbourne 
131eeb56abeSPeter Collingbourne // CHECK: ![[STRUCT]] = !DICompositeType(tag: DW_TAG_structure_type, name: "Struct",
132eeb56abeSPeter Collingbourne // CHECK-SAME:             scope: ![[NS]],
133dace7adaSAmy Huang // CHECK-SAME:             flags: DIFlagFwdDecl
134eeb56abeSPeter Collingbourne // CHECK-SAME:             identifier: "_ZTSN8DebugCXX6StructE")
135383f8413SDuncan P. N. Exon Smith 
136e5238d2aSAdrian Prantl // CHECK: !DICompositeType(tag: DW_TAG_union_type,
137dace7adaSAmy Huang // CHECK-SAME:             flags: DIFlagFwdDecl
13805fefa4aSAdrian Prantl // CHECK-SAME:             identifier: "_ZTS12TypedefUnion")
139e5238d2aSAdrian Prantl // CHECK: !DICompositeType(tag: DW_TAG_enumeration_type,
14005fefa4aSAdrian Prantl // CHECK-SAME:             flags: DIFlagFwdDecl,
14105fefa4aSAdrian Prantl // CHECK-SAME:             identifier: "_ZTS11TypedefEnum")
142e5238d2aSAdrian Prantl // CHECK: !DICompositeType(tag: DW_TAG_structure_type,
14305fefa4aSAdrian Prantl // CHECK-SAME:             flags: DIFlagFwdDecl,
14405fefa4aSAdrian Prantl // CHECK-SAME:             identifier: "_ZTS13TypedefStruct")
14505fefa4aSAdrian Prantl 
14605fefa4aSAdrian Prantl // This one isn't.
14705fefa4aSAdrian Prantl // CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "Template1<void *>",
14826cb1d26SAdrian Prantl // CHECK-SAME:             elements:
14905fefa4aSAdrian Prantl // CHECK-SAME:             templateParams:
15005fefa4aSAdrian Prantl // CHECK-SAME:             identifier: "_ZTS9Template1IPvE")
15105fefa4aSAdrian Prantl 
15205fefa4aSAdrian Prantl // This type is anchored in the module by an explicit template instantiation.
15305fefa4aSAdrian Prantl // CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "Template1<int>",
15405fefa4aSAdrian Prantl // CHECK-SAME:             flags: DIFlagFwdDecl,
15505fefa4aSAdrian Prantl // CHECK-SAME:             identifier: "_ZTS9Template1IiE")
15605fefa4aSAdrian Prantl 
15705fefa4aSAdrian Prantl // CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "FwdDeclTemplate<int>",
15826cb1d26SAdrian Prantl // CHECK-SAME:             elements:
15905fefa4aSAdrian Prantl // CHECK-SAME:             templateParams:
16005fefa4aSAdrian Prantl // CHECK-SAME:             identifier: "_ZTS15FwdDeclTemplateIiE")
161e5238d2aSAdrian Prantl 
16290931c48SAdrian Prantl // This type is defined locally and forward-declared in the module.
16388d79179SAdrian Prantl // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "PureFwdDecl",
16488d79179SAdrian Prantl // CHECK-SAME:             elements:
16588d79179SAdrian Prantl // CHECK-SAME:             identifier: "_ZTS11PureFwdDecl")
16688d79179SAdrian Prantl 
16790931c48SAdrian Prantl // This type is defined locally and forward-declared in the module.
16890931c48SAdrian Prantl // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "Member",
16990931c48SAdrian Prantl // CHECK-SAME:             elements:
17090931c48SAdrian Prantl // CHECK-SAME:             identifier: "_ZTSN11SpecializedIiE6MemberE")
17190931c48SAdrian Prantl 
1720dabc2adSAdrian Prantl // This type is defined locally and forward-declared in the module.
1730dabc2adSAdrian Prantl // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "Member",
1740dabc2adSAdrian Prantl // CHECK-SAME:             elements:
1750dabc2adSAdrian Prantl // CHECK-SAME:             identifier: "_ZTSN21FwdDeclTemplateMemberIiE6MemberE")
1760dabc2adSAdrian Prantl 
17726cb1d26SAdrian Prantl // This type is defined locally and forward-declared in the module.
17826cb1d26SAdrian Prantl // CHECK: !DIDerivedType(tag: DW_TAG_typedef, name: "SpecializedBase",
17926cb1d26SAdrian Prantl // CHECK-SAME:           baseType: ![[SPECIALIZEDBASE:.*]])
18026cb1d26SAdrian Prantl // CHECK: ![[SPECIALIZEDBASE]] =
18126cb1d26SAdrian Prantl // CHECK-SAME: !DICompositeType(tag: DW_TAG_class_type,
18226cb1d26SAdrian Prantl // CHECK-SAME:                  name: "WithSpecializedBase<float>",
18326cb1d26SAdrian Prantl // CHECK-SAME:                  elements:
18426cb1d26SAdrian Prantl // CHECK-SAME:                  identifier: "_ZTS19WithSpecializedBaseIfE")
18526cb1d26SAdrian Prantl 
18626cb1d26SAdrian Prantl // This type is explicitly specialized locally.
18726cb1d26SAdrian Prantl // CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "WithSpecializedBase<int>",
18826cb1d26SAdrian Prantl // CHECK-SAME:             elements:
18926cb1d26SAdrian Prantl // CHECK-SAME:             identifier: "_ZTS19WithSpecializedBaseIiE")
1900dabc2adSAdrian Prantl 
1915c8bd88aSAdrian Prantl // CHECK: !DIGlobalVariable(name: "anon_enum", {{.*}}, type: ![[ANON_ENUM:[0-9]+]]
1925c8bd88aSAdrian Prantl // CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, scope: ![[NS]],
193c5e3647fSAdrian Prantl // CHECK-SAME:             line: 19
1945c8bd88aSAdrian Prantl 
19543e00817SAdrian Prantl // CHECK: !DIGlobalVariable(name: "GlobalUnion",
19643e00817SAdrian Prantl // CHECK-SAME:              type: ![[GLOBAL_UNION:[0-9]+]]
197f9521b0bSDuncan P. N. Exon Smith // CHECK: ![[GLOBAL_UNION]] = distinct !DICompositeType(tag: DW_TAG_union_type,
19843e00817SAdrian Prantl // CHECK-SAME:                elements: !{{[0-9]+}})
19943e00817SAdrian Prantl // CHECK: !DIGlobalVariable(name: "GlobalStruct",
20043e00817SAdrian Prantl // CHECK-SAME:              type: ![[GLOBAL_STRUCT:[0-9]+]]
201f9521b0bSDuncan P. N. Exon Smith // CHECK: ![[GLOBAL_STRUCT]] = distinct !DICompositeType(tag: DW_TAG_structure_type,
20243e00817SAdrian Prantl // CHECK-SAME:                elements: !{{[0-9]+}})
20343e00817SAdrian Prantl 
20405fefa4aSAdrian Prantl 
2058f55b66aSAdrian Prantl // CHECK: !DIGlobalVariable(name: "anon",
2068f55b66aSAdrian Prantl // CHECK-SAME:              type: ![[GLOBAL_ANON:[0-9]+]]
2078f55b66aSAdrian Prantl // CHECK: ![[GLOBAL_ANON]] = !DICompositeType(tag: DW_TAG_structure_type,
2088f55b66aSAdrian Prantl // CHECK-SAME:              name: "InAnonymousNamespace", {{.*}}DIFlagFwdDecl)
2098f55b66aSAdrian Prantl 
21045a73836SJake Egan // CHECK: !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: !{{[0-9]+}}, entity: ![[STRUCT]], file: ![[CPP]], line: 50)
211c96da8faSAdrian Prantl 
212c96da8faSAdrian Prantl // CHECK: !DICompileUnit(
213c96da8faSAdrian Prantl // CHECK-SAME:           splitDebugFilename:
214c96da8faSAdrian Prantl // CHECK-SAME:           dwoId:
215d4e73e74SAdrian Prantl // CHECK-PCH: !DICompileUnit({{.*}}splitDebugFilename:
216ae108c47SAdrian Prantl // CHECK-PCH:                dwoId: 18446744073709551614
217a43acdc4SAdrian Prantl 
218a43acdc4SAdrian Prantl // CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "A",
219dace7adaSAmy Huang // CHECK-SAME:             DIFlagFwdDecl
220a43acdc4SAdrian Prantl 
221a43acdc4SAdrian Prantl // There is a full definition of the type available in the module.
222a43acdc4SAdrian Prantl // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "Virtual",
223dace7adaSAmy Huang // CHECK-SAME:             DIFlagFwdDecl
224dace7adaSAmy Huang // CHECK-SAME:             identifier: "_ZTS7Virtual")
225