From b8f7de94c3a8fb4556d06a1447880e69bc3a113c Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Sun, 22 Aug 2010 18:27:02 +0000 Subject: [PATCH] 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 --- lib/Sema/SemaDeclCXX.cpp | 1 + test/CodeGenCXX/copy-constructor-elim-2.cpp | 26 +++++++++++++++++++++ 2 files changed, 27 insertions(+) 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 + } +} -- 2.50.1