]> granicus.if.org Git - clang/commitdiff
Do not elide copy construction when we're performing base-class initialization
authorDouglas Gregor <dgregor@apple.com>
Sun, 22 Aug 2010 18:27:02 +0000 (18:27 +0000)
committerDouglas Gregor <dgregor@apple.com>
Sun, 22 Aug 2010 18:27:02 +0000 (18:27 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@111783 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDeclCXX.cpp
test/CodeGenCXX/copy-constructor-elim-2.cpp

index 4ffb6ab7dca7a478fa8898627df1e6f450726527..fd0bcfcadfbbe5177c8ba1ad81d13a7925b58854 100644 (file)
@@ -5425,6 +5425,7 @@ Sema::BuildCXXConstructExpr(SourceLocation ConstructLoc, QualType DeclInitType,
   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()));
   }
index 3a06c10ff18622381f64b06b67f15a99036a68a9..73e9b94bcd11d0159185c382cc3dcf4eb6f158e2 100644 (file)
@@ -5,3 +5,29 @@ A f() { return A(0); }
 // 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
+  }
+}