]> granicus.if.org Git - clang/commitdiff
Handle member initializers that point to fields in anonymous structs.
authorAnders Carlsson <andersca@mac.com>
Tue, 1 Sep 2009 04:31:02 +0000 (04:31 +0000)
committerAnders Carlsson <andersca@mac.com>
Tue, 1 Sep 2009 04:31:02 +0000 (04:31 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@80659 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaTemplateInstantiateDecl.cpp
test/SemaTemplate/instantiate-anonymous-union.cpp

index 84e464aba300817f7eefa7e6371e075c4bb83c52..314a99322b05a9b1c59b9a37b312877bfa3e711f 100644 (file)
@@ -1153,8 +1153,13 @@ Sema::InstantiateMemInitializers(CXXConstructorDecl *New,
                                      Init->getRParenLoc(),
                                      New->getParent());
     } else if (Init->isMemberInitializer()) {
-      FieldDecl *Member = 
-        cast<FieldDecl>(FindInstantiatedDecl(Init->getMember()));
+      FieldDecl *Member;
+      
+      // Is this an anonymous union?
+      if (FieldDecl *UnionInit = Init->getAnonUnionMember())
+        Member = cast<FieldDecl>(UnionInit);
+      else
+        Member = cast<FieldDecl>(FindInstantiatedDecl(Init->getMember()));
       
       NewInit = BuildMemberInitializer(Member, (Expr **)NewArgs.data(), 
                                        NewArgs.size(),
index 9c2467be64533bffa67590a0f09149e3ffb16cd6..2c1e9d4c1919e1780b0403c36bc0c7d1a6f7e55d 100644 (file)
@@ -19,3 +19,15 @@ template <typename T> struct B {
 };
 
 B<int> b0;
+
+template <typename T> struct C {
+  union {
+    int a;
+    void* b;
+  };
+
+  C(int a) : a(a) { }
+  C(void* b) : b(b) { }
+};
+
+C<int> c0;