]> granicus.if.org Git - clang/commitdiff
When synthesizing implicit copy/move constructors and copy/move assignment
authorJohn McCall <rjmccall@apple.com>
Fri, 17 Jun 2011 00:18:42 +0000 (00:18 +0000)
committerJohn McCall <rjmccall@apple.com>
Fri, 17 Jun 2011 00:18:42 +0000 (00:18 +0000)
operators, don't make an initializer or sub-operation for zero-width
bitfields.

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

lib/Sema/SemaDeclCXX.cpp
test/CodeGenCXX/implicit-copy-constructor.cpp

index 09597d2ef1fb54432ef7730cf08cf1926a0a4e1b..53b5ad276551a8121026b419d926fdadfa9ef6f1 100644 (file)
@@ -1972,6 +1972,11 @@ BuildImplicitMemberInitializer(Sema &SemaRef, CXXConstructorDecl *Constructor,
   if (ImplicitInitKind == IIK_Copy) {
     ParmVarDecl *Param = Constructor->getParamDecl(0);
     QualType ParamType = Param->getType().getNonReferenceType();
+
+    // Suppress copying zero-width bitfields.
+    if (const Expr *Width = Field->getBitWidth())
+      if (Width->EvaluateAsInt(SemaRef.Context) == 0)
+        return false;
     
     Expr *MemberExprBase = 
       DeclRefExpr::Create(SemaRef.Context, NestedNameSpecifierLoc(), Param, 
@@ -2256,11 +2261,10 @@ Sema::SetDelegatingInitializer(CXXConstructorDecl *Constructor,
   return false;
 }
                                
-bool
-Sema::SetCtorInitializers(CXXConstructorDecl *Constructor,
-                                  CXXCtorInitializer **Initializers,
-                                  unsigned NumInitializers,
-                                  bool AnyErrors) {
+bool Sema::SetCtorInitializers(CXXConstructorDecl *Constructor,
+                               CXXCtorInitializer **Initializers,
+                               unsigned NumInitializers,
+                               bool AnyErrors) {
   if (Constructor->getDeclContext()->isDependentContext()) {
     // Just store the initializers as written, they will be checked during
     // instantiation.
@@ -7011,6 +7015,11 @@ void Sema::DefineImplicitCopyAssignment(SourceLocation CurrentLocation,
       Invalid = true;      
       continue;
     }
+
+    // Suppress assigning zero-width bitfields.
+    if (const Expr *Width = Field->getBitWidth())
+      if (Width->EvaluateAsInt(Context) == 0)
+        continue;
     
     QualType FieldType = Field->getType().getNonReferenceType();
     if (FieldType->isIncompleteArrayType()) {
index 500860182eccf613ef02b6f99801d66ca224576e..8bc84a534b3658cd959902668be9e3bd42e5d7cc 100644 (file)
@@ -70,3 +70,13 @@ void test_X2()
   pimpl pdata;
   pdata.f0( new impl(*i));
 }
+
+// rdar://problem/9598341
+namespace test3 {
+  struct A { A(const A&); A&operator=(const A&); };
+  struct B { A a; unsigned : 0; };
+  void test(const B &x) {
+    B y = x;
+    y = x;
+  }
+}