<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Apr 25, 2016, at 5:34 PM, Richard Smith <<a href="mailto:richard@metafoo.co.uk" class="">richard@metafoo.co.uk</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><div class="gmail_extra"><div class="gmail_quote">On Mon, Apr 25, 2016 at 1:52 PM, Adrian Prantl via cfe-commits<span class="Apple-converted-space"> </span><span dir="ltr" class=""><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank" class="">cfe-commits@lists.llvm.org</a>></span><span class="Apple-converted-space"> </span>wrote:<br class=""><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex;">Author: adrian<br class="">Date: Mon Apr 25 15:52:40 2016<br class="">New Revision: 267464<br class=""><br class="">URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project?rev=267464&view=rev" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project?rev=267464&view=rev</a><br class="">Log:<br class="">Module Debugging: Fix the condition for determining whether a template<br class="">instantiation is in a module.<br class=""><br class="">This patch fixes the condition for determining whether the debug info for a<br class="">template instantiation will exist in an imported clang module by:<br class=""><br class="">- checking whether the ClassTemplateSpecializationDecl is complete and<br class="">- checking that the instantiation was in a module by looking at the first field.<br class=""><br class="">I also added a negative check to make sure that a typedef to a forward-declared<br class="">template (with the definition outside of the module) is handled correctly.<br class=""><br class=""><a href="http://reviews.llvm.org/D19443" rel="noreferrer" target="_blank" class="">http://reviews.llvm.org/D19443</a><br class=""><a href="rdar://problem/25553724" class="">rdar://problem/25553724</a><br class=""><br class="">Modified:<br class="">   <span class="Apple-converted-space"> </span>cfe/trunk/lib/CodeGen/CGDebugInfo.cpp<br class="">   <span class="Apple-converted-space"> </span>cfe/trunk/test/Modules/ExtDebugInfo.cpp<br class="">   <span class="Apple-converted-space"> </span>cfe/trunk/test/Modules/Inputs/DebugCXX.h<br class="">   <span class="Apple-converted-space"> </span>cfe/trunk/test/Modules/ModuleDebugInfo.cpp<br class=""><br class="">Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp<br class="">URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=267464&r1=267463&r2=267464&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=267464&r1=267463&r2=267464&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)<br class="">+++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Mon Apr 25 15:52:40 2016<br class="">@@ -1514,12 +1514,28 @@ static bool hasExplicitMemberDefinition(<br class="">   return false;<br class=""> }<br class=""><br class="">+/// Does a type definition exist in an imported clang module?<br class="">+static bool isDefinedInClangModule(const RecordDecl *RD) {<br class="">+  if (!RD->isFromASTFile())<br class="">+    return false;<br class="">+  if (!RD->getDefinition())<br class="">+    return false;<br class="">+  if (!RD->isExternallyVisible() && RD->getName().empty())<br class="">+    return false;<br class="">+  if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(RD)) {<br class=""></blockquote><div class=""><br class=""></div><div class="">The same issue also affects member classes of class template specializations (you can detect them with RD->getInstantiatedFromMemberClass(), or detect all the relevant cases at once with RD->getTemplateSpecializationKind()).</div></div></div></div></div></blockquote><div><br class=""></div>I added a testcase for this r267612, but I couldn’t reproduce the situation that you were describing here. Do you have an example of what you had in mind?<br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><div class="gmail_extra"><div class="gmail_quote"><div class=""><br class=""></div><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex;">+    if (!CTSD->isCompleteDefinition())<br class="">+      return false;<br class=""></blockquote><div class=""><br class=""></div><div class="">You already checked this a few lines above. Actually, the two checks do different things depending on whether RD or some other declaration is the definition; did you really mean to treat a (non-template) class that's defined locally but forward-declared within a module as being defined in that module? (It might make more sense to map to the definition upfront and do all your queries on that if that's what you intend to check.)</div></div></div></div></div></blockquote><div><br class=""></div><div>Thanks! I changed this in r267611 to always pass RD->getDefinition() into isDefinedInClangModule. Does this make the check for isCompleteDefinition() redundant? Looking at the source for TagDecl::getDefinition() I’m not sure.</div><div><br class=""></div><div>-- adrian</div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><div class="gmail_extra"><div class="gmail_quote"><div class=""> </div><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex;">+    // Make sure the instantiation is actually in a module.<br class="">+    if (CTSD->field_begin() != CTSD->field_end())<br class="">+      return CTSD->field_begin()->isFromASTFile();<br class="">+  }<br class="">+  return true;<br class="">+}<br class="">+<br class=""> static bool shouldOmitDefinition(codegenoptions::DebugInfoKind DebugKind,<br class="">                                 <span class="Apple-converted-space"> </span>bool DebugTypeExtRefs, const RecordDecl *RD,<br class="">                                 <span class="Apple-converted-space"> </span>const LangOptions &LangOpts) {<br class="">-  // Does the type exist in an imported clang module?<br class="">-  if (DebugTypeExtRefs && RD->isFromASTFile() && RD->getDefinition() &&<br class="">-      (RD->isExternallyVisible() || !RD->getName().empty()))<br class="">+  if (DebugTypeExtRefs && isDefinedInClangModule(RD))<br class="">     return true;<br class=""><br class="">   if (DebugKind > codegenoptions::LimitedDebugInfo)<br class=""><br class="">Modified: cfe/trunk/test/Modules/ExtDebugInfo.cpp<br class="">URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/ExtDebugInfo.cpp?rev=267464&r1=267463&r2=267464&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/ExtDebugInfo.cpp?rev=267464&r1=267463&r2=267464&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/test/Modules/ExtDebugInfo.cpp (original)<br class="">+++ cfe/trunk/test/Modules/ExtDebugInfo.cpp Mon Apr 25 15:52:40 2016<br class="">@@ -2,7 +2,7 @@<br class=""> // Test that only forward declarations are emitted for types dfined in modules.<br class=""><br class=""> // Modules:<br class="">-// RUN: %clang_cc1 -x objective-c++ -std=c++11 -debug-info-kind=limited \<br class="">+// RUN: %clang_cc1 -x objective-c++ -std=c++11 -debug-info-kind=standalone \<br class=""> // RUN:     -dwarf-ext-refs -fmodules                                   \<br class=""> // RUN:     -fmodule-format=obj -fimplicit-module-maps -DMODULES \<br class=""> // RUN:     -triple %itanium_abi_triple \<br class="">@@ -13,7 +13,7 @@<br class=""> // RUN: %clang_cc1 -x c++ -std=c++11 -fmodule-format=obj -emit-pch -I%S/Inputs \<br class=""> // RUN:     -triple %itanium_abi_triple \<br class=""> // RUN:     -o %t.pch %S/Inputs/DebugCXX.h<br class="">-// RUN: %clang_cc1 -std=c++11 -debug-info-kind=limited \<br class="">+// RUN: %clang_cc1 -std=c++11 -debug-info-kind=standalone \<br class=""> // RUN:     -dwarf-ext-refs -fmodule-format=obj \<br class=""> // RUN:     -triple %itanium_abi_triple \<br class=""> // RUN:     -include-pch %t.pch %s -emit-llvm -o %t-pch.ll %s<br class="">@@ -30,7 +30,9 @@ Struct s;<br class=""> DebugCXX::Enum e;<br class=""> DebugCXX::Template<long> implicitTemplate;<br class=""> DebugCXX::Template<int> explicitTemplate;<br class="">-DebugCXX::FloatInstatiation typedefTemplate;<br class="">+DebugCXX::FloatInstantiation typedefTemplate;<br class="">+DebugCXX::B anchoredTemplate;<br class="">+<br class=""> int Struct::static_member = -1;<br class=""> enum {<br class="">   e3 = -1<br class="">@@ -41,6 +43,11 @@ char _anchor = anon_enum + conflicting_u<br class=""> TypedefUnion tdu;<br class=""> TypedefEnum tde;<br class=""> TypedefStruct tds;<br class="">+TypedefTemplate tdt;<br class="">+Template1<int> explicitTemplate1;<br class="">+<br class="">+template <class T> class FwdDeclTemplate { T t; };<br class="">+TypedefFwdDeclTemplate tdfdt;<br class=""><br class=""> InAnonymousNamespace anon;<br class=""><br class="">@@ -48,7 +55,8 @@ void foo() {<br class="">   anon.i = GlobalStruct.i = GlobalUnion.i = GlobalEnum;<br class=""> }<br class=""><br class="">-// CHECK: ![[STRUCT:[0-9]+]] = !DICompositeType(tag: DW_TAG_structure_type, name: "Struct",<br class="">+<br class="">+// CHECK: ![[STRUCT:.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "Struct",<br class=""> // CHECK-SAME:             scope: ![[NS:[0-9]+]],<br class=""> // CHECK-SAME:             flags: DIFlagFwdDecl,<br class=""> // CHECK-SAME:             identifier: "_ZTSN8DebugCXX6StructE")<br class="">@@ -61,25 +69,69 @@ void foo() {<br class=""> // CHECK-SAME:             flags: DIFlagFwdDecl,<br class=""> // CHECK-SAME:             identifier:  "_ZTSN8DebugCXX4EnumE")<br class=""><br class="">-// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "Template<int, DebugCXX::traits<int> >",<br class="">+// This type is anchored in the module by an explicit template instantiation.<br class="">+// CHECK: !DICompositeType(tag: DW_TAG_class_type,<br class="">+// CHECK-SAME:             name: "Template<long, DebugCXX::traits<long> >",<br class=""> // CHECK-SAME:             scope: ![[NS]],<br class=""> // CHECK-SAME:             flags: DIFlagFwdDecl,<br class="">-// CHECK-SAME:             identifier: "_ZTSN8DebugCXX8TemplateIiNS_6traitsIiEEEE")<br class="">+// CHECK-SAME:             identifier: "_ZTSN8DebugCXX8TemplateIlNS_6traitsIlEEEE")<br class=""><br class="">-// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "Template<float, DebugCXX::traits<float> >",<br class="">+// This type is anchored in the module by an explicit template instantiation.<br class="">+// CHECK: !DICompositeType(tag: DW_TAG_class_type,<br class="">+// CHECK-SAME:             name: "Template<int, DebugCXX::traits<int> >",<br class=""> // CHECK-SAME:             scope: ![[NS]],<br class=""> // CHECK-SAME:             flags: DIFlagFwdDecl,<br class="">+// CHECK-SAME:             identifier: "_ZTSN8DebugCXX8TemplateIiNS_6traitsIiEEEE")<br class="">+<br class="">+// This type isn't, however, even with standalone non-module debug info this<br class="">+// type is a forward declaration.<br class="">+// CHECK-NOT: !DICompositeType(tag: DW_TAG_structure_type, name: "traits<int>",<br class="">+<br class="">+// This one isn't.<br class="">+// CHECK: !DICompositeType(tag: DW_TAG_class_type,<br class="">+// CHECK-SAME:             name: "Template<float, DebugCXX::traits<float> >",<br class="">+// CHECK-SAME:             scope: ![[NS]],<br class="">+// CHECK-SAME:             templateParams:<br class=""> // CHECK-SAME:             identifier: "_ZTSN8DebugCXX8TemplateIfNS_6traitsIfEEEE")<br class=""><br class="">+// This type is anchored in the module by an explicit template instantiation.<br class="">+// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "traits<float>",<br class="">+// CHECK-SAME:             flags: DIFlagFwdDecl,<br class="">+// CHECK-SAME:             identifier: "_ZTSN8DebugCXX6traitsIfEE")<br class="">+<br class="">+<br class="">+// This type is anchored in the module by an explicit template instantiation.<br class="">+// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "A<void>",<br class="">+// CHECK-SAME:             scope: ![[NS]],<br class="">+// CHECK-SAME:             flags: DIFlagFwdDecl,<br class="">+// CHECK-SAME:             identifier: "_ZTSN8DebugCXX1AIJvEEE")<br class="">+<br class=""> // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "static_member",<br class=""> // CHECK-SAME:           scope: ![[STRUCT]]<br class=""><br class=""> // CHECK: !DICompositeType(tag: DW_TAG_union_type,<br class="">-// CHECK-SAME:             flags: DIFlagFwdDecl, identifier: "_ZTS12TypedefUnion")<br class="">+// CHECK-SAME:             flags: DIFlagFwdDecl,<br class="">+// CHECK-SAME:             identifier: "_ZTS12TypedefUnion")<br class=""> // CHECK: !DICompositeType(tag: DW_TAG_enumeration_type,<br class="">-// CHECK-SAME:             flags: DIFlagFwdDecl, identifier: "_ZTS11TypedefEnum")<br class="">+// CHECK-SAME:             flags: DIFlagFwdDecl,<br class="">+// CHECK-SAME:             identifier: "_ZTS11TypedefEnum")<br class=""> // CHECK: !DICompositeType(tag: DW_TAG_structure_type,<br class="">-// CHECK-SAME:             flags: DIFlagFwdDecl, identifier: "_ZTS13TypedefStruct")<br class="">+// CHECK-SAME:             flags: DIFlagFwdDecl,<br class="">+// CHECK-SAME:             identifier: "_ZTS13TypedefStruct")<br class="">+<br class="">+// This one isn't.<br class="">+// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "Template1<void *>",<br class="">+// CHECK-SAME:             templateParams:<br class="">+// CHECK-SAME:             identifier: "_ZTS9Template1IPvE")<br class="">+<br class="">+// This type is anchored in the module by an explicit template instantiation.<br class="">+// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "Template1<int>",<br class="">+// CHECK-SAME:             flags: DIFlagFwdDecl,<br class="">+// CHECK-SAME:             identifier: "_ZTS9Template1IiE")<br class="">+<br class="">+// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "FwdDeclTemplate<int>",<br class="">+// CHECK-SAME:             templateParams:<br class="">+// CHECK-SAME:             identifier: "_ZTS15FwdDeclTemplateIiE")<br class=""><br class=""> // CHECK: !DIGlobalVariable(name: "anon_enum", {{.*}}, type: ![[ANON_ENUM:[0-9]+]]<br class=""> // CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, scope: ![[NS]],<br class="">@@ -94,6 +146,7 @@ void foo() {<br class=""> // CHECK: ![[GLOBAL_STRUCT]] = distinct !DICompositeType(tag: DW_TAG_structure_type,<br class=""> // CHECK-SAME:                elements: !{{[0-9]+}})<br class=""><br class="">+<br class=""> // CHECK: !DIGlobalVariable(name: "anon",<br class=""> // CHECK-SAME:              type: ![[GLOBAL_ANON:[0-9]+]]<br class=""> // CHECK: ![[GLOBAL_ANON]] = !DICompositeType(tag: DW_TAG_structure_type,<br class=""><br class="">Modified: cfe/trunk/test/Modules/Inputs/DebugCXX.h<br class="">URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/DebugCXX.h?rev=267464&r1=267463&r2=267464&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/DebugCXX.h?rev=267464&r1=267463&r2=267464&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/test/Modules/Inputs/DebugCXX.h (original)<br class="">+++ cfe/trunk/test/Modules/Inputs/DebugCXX.h Mon Apr 25 15:52:40 2016<br class="">@@ -24,10 +24,11 @@ namespace DebugCXX {<br class="">           > class Template {<br class="">     T member;<br class="">   };<br class="">+  // Explicit template instantiation.<br class="">   extern template class Template<int>;<br class=""><br class="">   extern template struct traits<float>;<br class="">-  typedef class Template<float> FloatInstatiation;<br class="">+  typedef class Template<float> FloatInstantiation;<br class=""><br class="">   inline void fn() {<br class="">     Template<long> invisible;<br class="">@@ -48,6 +49,7 @@ namespace DebugCXX {<br class="">   template <typename...> class A;<br class="">   template <typename T> class A<T> {};<br class="">   typedef A<void> B;<br class="">+  // Anchored by a function parameter.<br class="">   void foo(B) {}<br class=""> }<br class=""><br class="">@@ -83,3 +85,13 @@ class Derived : Base {<br class="">     Derived *getParent() const override;<br class="">   };<br class=""> };<br class="">+<br class="">+template <class T><br class="">+class Template1 {<br class="">+  T t;<br class="">+};<br class="">+typedef Template1<void *> TypedefTemplate;<br class="">+extern template class Template1<int>;<br class="">+<br class="">+template <class T> class FwdDeclTemplate;<br class="">+typedef FwdDeclTemplate<int> TypedefFwdDeclTemplate;<br class=""><br class="">Modified: cfe/trunk/test/Modules/ModuleDebugInfo.cpp<br class="">URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/ModuleDebugInfo.cpp?rev=267464&r1=267463&r2=267464&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/ModuleDebugInfo.cpp?rev=267464&r1=267463&r2=267464&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/test/Modules/ModuleDebugInfo.cpp (original)<br class="">+++ cfe/trunk/test/Modules/ModuleDebugInfo.cpp Mon Apr 25 15:52:40 2016<br class="">@@ -47,19 +47,39 @@<br class=""> // CHECK: !DIDerivedType(tag: DW_TAG_typedef, name: "B",<br class=""> // no mangled name here yet.<br class=""><br class="">+// This type is anchored by a function parameter.<br class=""> // CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "A<void>"<br class="">+// CHECK-SAME:             templateParams:<br class=""> // CHECK-SAME:             identifier: "_ZTSN8DebugCXX1AIJvEEE")<br class=""><br class=""> // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "Struct"<br class=""> // CHECK-SAME:             identifier: "_ZTSN8DebugCXX6StructE")<br class=""><br class="">-// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "Template<int, DebugCXX::traits<int> >"<br class="">+// This type is anchored by an explicit template instantiation.<br class="">+// CHECK: !DICompositeType(tag: DW_TAG_class_type,<br class="">+// CHECK-SAME:             name: "Template<int, DebugCXX::traits<int> >"<br class="">+// CHECK-SAME:             templateParams:<br class=""> // CHECK-SAME:             identifier: "_ZTSN8DebugCXX8TemplateIiNS_6traitsIiEEEE")<br class=""><br class="">-// CHECK: !DIDerivedType(tag: DW_TAG_typedef, name: "FloatInstatiation"<br class="">+// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "traits<int>"<br class="">+// CHECK-SAME:             flags: DIFlagFwdDecl<br class="">+// CHECK-SAME:             identifier: "_ZTSN8DebugCXX6traitsIiEE")<br class="">+<br class="">+// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "traits<float>"<br class="">+// CHECK-SAME:             templateParams:<br class="">+// CHECK-SAME:             identifier: "_ZTSN8DebugCXX6traitsIfEE")<br class="">+<br class="">+// CHECK: !DICompositeType(tag: DW_TAG_class_type,<br class="">+// CHECK-SAME:             name: "Template<long, DebugCXX::traits<long> >"<br class="">+// CHECK-SAME:             templateParams:<br class="">+// CHECK-SAME:             identifier: "_ZTSN8DebugCXX8TemplateIlNS_6traitsIlEEEE")<br class="">+<br class="">+// CHECK: !DIDerivedType(tag: DW_TAG_typedef, name: "FloatInstantiation"<br class=""> // no mangled name here yet.<br class=""><br class="">-// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "Template<float, DebugCXX::traits<float> >"<br class="">+// CHECK: !DICompositeType(tag: DW_TAG_class_type,<br class="">+// CHECK-SAME:             name: "Template<float, DebugCXX::traits<float> >"<br class="">+// CHECK-SAME:             flags: DIFlagFwdDecl<br class=""> // CHECK-SAME:             identifier: "_ZTSN8DebugCXX8TemplateIfNS_6traitsIfEEEE")<br class=""><br class=""> // CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "FwdVirtual"<br class="">@@ -87,12 +107,28 @@<br class=""> // CHECK-SAME:             name: "InAnonymousNamespace",<br class=""> // CHECK-SAME:             elements: !{{[0-9]+}})<br class=""><br class="">-// CHECK: ![[A:[0-9]+]] = {{.*}}!DICompositeType(tag: DW_TAG_class_type, name: "A",<br class="">-// CHECK: ![[DERIVED:[0-9]+]] = {{.*}}!DICompositeType(tag: DW_TAG_class_type, name: "Derived",<br class="">-// CHECK-SAME:                                         identifier: "_ZTS7Derived")<br class="">+// CHECK: ![[DERIVED:.*]] = {{.*}}!DICompositeType(tag: DW_TAG_class_type, name: "Derived",<br class="">+// CHECK-SAME:                                     identifier: "_ZTS7Derived")<br class=""> // CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "B", scope: ![[DERIVED]],<br class="">-// CHECK-SAME:             elements: ![[B_MBRS:.*]], vtableHolder: ![[A]]<br class="">+// CHECK-SAME:             elements: ![[B_MBRS:.*]], vtableHolder:<br class=""> // CHECK: ![[B_MBRS]] = !{{{.*}}, ![[GET_PARENT:.*]]}<br class=""> // CHECK: ![[GET_PARENT]] = !DISubprogram(name: "getParent"<br class=""><br class="">+// CHECK: !DIDerivedType(tag: DW_TAG_typedef, name: "TypedefTemplate",<br class="">+// CHECK-SAME:           baseType: ![[BASE:.*]])<br class="">+// CHECK: ![[BASE]] = !DICompositeType(tag: DW_TAG_class_type,<br class="">+// CHECK-SAME:                         name: "Template1<void *>",<br class="">+// CHECK-SAME:                         flags: DIFlagFwdDecl,<br class="">+// CHECK-SAME:                         identifier: "_ZTS9Template1IPvE")<br class="">+<br class="">+// Explicit instatiation.<br class="">+// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "Template1<int>",<br class="">+// CHECK-SAME:             templateParams:<br class="">+// CHECK-SAME:             identifier: "_ZTS9Template1IiE")<br class="">+<br class="">+// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "FwdDeclTemplate<int>",<br class="">+// CHECK-SAME:             flags: DIFlagFwdDecl<br class="">+// CHECK-SAME:             identifier: "_ZTS15FwdDeclTemplateIiE")<br class="">+<br class="">+<br class=""> // CHECK-NEG-NOT: !DICompositeType(tag: DW_TAG_structure_type, name: "PureForwardDecl"<br class=""><br class=""><br class="">_______________________________________________<br class="">cfe-commits mailing list<br class=""><a href="mailto:cfe-commits@lists.llvm.org" class="">cfe-commits@lists.llvm.org</a><br class=""><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a></blockquote></div></div></div></div></blockquote></div><br class=""></body></html>