[cfe-commits] r111783 - in /cfe/trunk: lib/Sema/SemaDeclCXX.cpp test/CodeGenCXX/copy-constructor-elim-2.cpp

Douglas Gregor dgregor at apple.com
Sun Aug 22 11:27:02 PDT 2010


Author: dgregor
Date: Sun Aug 22 13:27:02 2010
New Revision: 111783

URL: http://llvm.org/viewvc/llvm-project?rev=111783&view=rev
Log:
Do not elide copy construction when we're performing base-class initialization

Modified:
    cfe/trunk/lib/Sema/SemaDeclCXX.cpp
    cfe/trunk/test/CodeGenCXX/copy-constructor-elim-2.cpp

Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=111783&r1=111782&r2=111783&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Sun Aug 22 13:27:02 2010
@@ -5425,6 +5425,7 @@
   if (Constructor->isCopyConstructor() && ExprArgs.size() >= 1) {
     Expr *SubExpr = ((Expr **)ExprArgs.get())[0];
     Elidable = SubExpr->isTemporaryObject() &&
+      ConstructKind == CXXConstructExpr::CK_Complete &&
       Context.hasSameUnqualifiedType(SubExpr->getType(), 
                            Context.getTypeDeclType(Constructor->getParent()));
   }

Modified: cfe/trunk/test/CodeGenCXX/copy-constructor-elim-2.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/copy-constructor-elim-2.cpp?rev=111783&r1=111782&r2=111783&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/copy-constructor-elim-2.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/copy-constructor-elim-2.cpp Sun Aug 22 13:27:02 2010
@@ -5,3 +5,29 @@
 // CHECK: define void @_Z1fv
 // CHECK: call void @_ZN1AC1Ei
 // CHECK-NEXT: ret void
+
+// Verify that we do not elide copies when constructing a base class.
+namespace no_elide_base {
+  struct Base { 
+    Base(const Base&);
+    ~Base();
+  };
+
+  struct Other {
+    operator Base() const;
+  };
+
+  struct Derived : public virtual Base { 
+    Derived(const Other &O);
+  };
+
+  // CHECK: define void @_ZN13no_elide_base7DerivedC1ERKNS_5OtherE
+  Derived::Derived(const Other &O) 
+    // CHECK: call void @_ZNK13no_elide_base5OthercvNS_4BaseEEv
+    // CHECK: call void @_ZN13no_elide_base4BaseC2ERKS0_
+    // CHECK: call void @_ZN13no_elide_base4BaseD1Ev
+    : Base(O)
+  {
+    // CHECK: ret void
+  }
+}





More information about the cfe-commits mailing list