[cfe-commits] r139996 - in /cfe/trunk: lib/Sema/SemaDeclCXX.cpp test/CXX/special/class.init/class.base.init/p8-0x.cpp

Richard Smith richard-llvm at metafoo.co.uk
Sun Sep 18 04:14:50 PDT 2011


Author: rsmith
Date: Sun Sep 18 06:14:50 2011
New Revision: 139996

URL: http://llvm.org/viewvc/llvm-project?rev=139996&view=rev
Log:
PR10954: variant members should not be implicitly initialized in constructors if no
mem-initializer is specified for them, unless an in-class initializer is specified.

Modified:
    cfe/trunk/lib/Sema/SemaDeclCXX.cpp
    cfe/trunk/test/CXX/special/class.init/class.base.init/p8-0x.cpp

Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=139996&r1=139995&r2=139996&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Sun Sep 18 06:14:50 2011
@@ -2291,6 +2291,11 @@
     return false;
   }
 
+  // Don't build an implicit initializer for union members if none was
+  // explicitly specified.
+  if (Field->getParent()->isUnion())
+    return false;
+
   // Don't try to build an implicit initializer if there were semantic
   // errors in any of the initializers (and therefore we might be
   // missing some that the user actually wrote).
@@ -2464,17 +2469,6 @@
         continue;
       }
       
-      // If this field is somewhere within an anonymous union, we only 
-      // initialize it if there's an explicit initializer.
-      if (isWithinAnonymousUnion(F)) {
-        if (CXXCtorInitializer *Init
-              = Info.AllBaseFields.lookup(F->getAnonField())) {
-          Info.AllToInit.push_back(Init);
-        }
-        
-        continue;
-      }
-      
       // Initialize each field of an anonymous struct individually.
       if (CollectFieldInitializer(*this, Info, F->getAnonField(), F))
         HadError = true;

Modified: cfe/trunk/test/CXX/special/class.init/class.base.init/p8-0x.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/special/class.init/class.base.init/p8-0x.cpp?rev=139996&r1=139995&r2=139996&view=diff
==============================================================================
--- cfe/trunk/test/CXX/special/class.init/class.base.init/p8-0x.cpp (original)
+++ cfe/trunk/test/CXX/special/class.init/class.base.init/p8-0x.cpp Sun Sep 18 06:14:50 2011
@@ -5,11 +5,15 @@
   int &a; // expected-note 2{{here}}
   int &b = n;
 
+  union {
+    const int k = 42;
+  };
+
   S() {} // expected-error {{constructor for 'S' must explicitly initialize the reference member 'a'}}
   S(int) : a(n) {} // ok
   S(char) : b(n) {} // expected-error {{constructor for 'S' must explicitly initialize the reference member 'a'}}
   S(double) : a(n), b(n) {} // ok
-};
+} s(0);
 
 union U {
   int a = 0;
@@ -21,3 +25,27 @@
   U(char) : b('y') {} // desired-error {{at most one member of a union may be initialized}}
   U(double) : a(1), b('y') {} // desired-error {{at most one member of a union may be initialized}}
 };
+
+// PR10954: variant members do not acquire an implicit initializer.
+namespace VariantMembers {
+  struct NoDefaultCtor {
+    NoDefaultCtor(int);
+  };
+  union V {
+    NoDefaultCtor ndc;
+    int n;
+
+    V() {}
+    V(int n) : n(n) {}
+    V(int n, bool) : ndc(n) {}
+  };
+  struct K {
+    union {
+      NoDefaultCtor ndc;
+      int n;
+    };
+    K() {}
+    K(int n) : n(n) {}
+    K(int n, bool) : ndc(n) {}
+  };
+}





More information about the cfe-commits mailing list