]> granicus.if.org Git - clang/commitdiff
[modules] Delay loading the field declared with an anonymous tag declaration
authorRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 10 Oct 2014 22:37:41 +0000 (22:37 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 10 Oct 2014 22:37:41 +0000 (22:37 +0000)
until after we've had a chance to merge that tag.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@219539 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Serialization/ASTReaderDecl.cpp
test/Modules/Inputs/cxx-templates-a.h
test/Modules/Inputs/cxx-templates-c.h
test/Modules/cxx-templates.cpp

index 93cd932a6187bbe0c2f5d7a51ed743d65d362a55..51d930073dc81c4e7de78eda22f08456074a6fef 100644 (file)
@@ -535,7 +535,7 @@ ASTDeclReader::RedeclarableResult ASTDeclReader::VisitTagDecl(TagDecl *TD) {
     TypedefNameForLinkage = Reader.GetIdentifierInfo(F, Record, Idx);
     break;
   case 3: // DeclaratorForAnonDecl
-    TD->NamedDeclOrQualifier = ReadDeclAs<NamedDecl>(Record, Idx);
+    NamedDeclForTagDecl = ReadDeclID(Record, Idx);
     break;
   default:
     llvm_unreachable("unexpected tag info kind");
index c2ce74d195b65293d7493bc2430b5f2fd2f1451a..92333b377a196a800e35dc7748d960d164e4fb54 100644 (file)
@@ -89,3 +89,11 @@ typedef PartiallyInstantiatePartialSpec<int*> PartiallyInstantiatePartialSpecHel
 void InstantiateWithAliasTemplate(WithAliasTemplate<int>::X<char>);
 inline int InstantiateWithAnonymousDeclsA(WithAnonymousDecls<int> x) { return (x.k ? x.a : x.b) + (x.k ? x.s.c : x.s.d) + x.e; }
 inline int InstantiateWithAnonymousDeclsB2(WithAnonymousDecls<char> x);
+
+
+template<typename T1 = int>
+struct MergeAnonUnionMember {
+  MergeAnonUnionMember() { (void)values.t1; }
+  union { int t1; } values;
+};
+inline MergeAnonUnionMember<> maum_a() { return {}; }
index 6daffadc6cede36d7ecc483545ea93c2a12be53d..6b4c50667065faa98bb626300f1299ecd8b5adc0 100644 (file)
@@ -11,3 +11,10 @@ template<typename T> struct MergeTemplateDefinitions {
   static constexpr int g();
 };
 template<typename T> constexpr int MergeTemplateDefinitions<T>::g() { return 2; }
+
+template<typename T1 = int>
+struct MergeAnonUnionMember {
+  MergeAnonUnionMember() { (void)values.t1; }
+  union { int t1; } values;
+};
+inline MergeAnonUnionMember<> maum_c() { return {}; }
index 3833e995c52edf97e1799bf6c39b262255fcd787..b2992336651316780cf718080779309d0dfcbdb1 100644 (file)
@@ -144,6 +144,8 @@ MergeSpecializations<double>::explicitly_specialized_in_b spec_in_b_2;
 MergeSpecializations<bool>::explicitly_specialized_in_c spec_in_c_2;
 #endif
 
+MergeAnonUnionMember<> maum_main;
+
 using AliasTemplateMergingTest = WithAliasTemplate<int>::X<char>;
 
 int AnonymousDeclsMergingTest(WithAnonymousDecls<int> WAD, WithAnonymousDecls<char> WADC) {