Do not elide copy construction when we're performing base-class initialization

llvm-svn: 111783
This commit is contained in:
Douglas Gregor 2010-08-22 18:27:02 +00:00
parent 932c19dc9f
commit ec3a3f5257
2 changed files with 27 additions and 0 deletions

View 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()));
}

View 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
}
}