aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-08-22 18:27:02 +0000
committerDouglas Gregor <dgregor@apple.com>2010-08-22 18:27:02 +0000
commitb8f7de94c3a8fb4556d06a1447880e69bc3a113c (patch)
tree109f4697dac791598a2e2c9b29a12676e038f069
parentdb68e28c05a67735211e688009890cf834c22e75 (diff)
Do not elide copy construction when we're performing base-class initialization
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@111783 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Sema/SemaDeclCXX.cpp1
-rw-r--r--test/CodeGenCXX/copy-constructor-elim-2.cpp26
2 files changed, 27 insertions, 0 deletions
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp
index 4ffb6ab7dc..fd0bcfcadf 100644
--- a/lib/Sema/SemaDeclCXX.cpp
+++ b/lib/Sema/SemaDeclCXX.cpp
@@ -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()));
}
diff --git a/test/CodeGenCXX/copy-constructor-elim-2.cpp b/test/CodeGenCXX/copy-constructor-elim-2.cpp
index 3a06c10ff1..73e9b94bcd 100644
--- a/test/CodeGenCXX/copy-constructor-elim-2.cpp
+++ b/test/CodeGenCXX/copy-constructor-elim-2.cpp
@@ -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
+ }
+}