Destroy bound temporaries.

llvm-svn: 79196
This commit is contained in:
Anders Carlsson 2009-08-16 17:50:25 +00:00
parent 84b4d2241f
commit b80760bd78
2 changed files with 16 additions and 1 deletions

View File

@ -486,7 +486,6 @@ class CXXConstructExpr : public Expr {
Stmt **Args;
unsigned NumArgs;
protected:
CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T,

View File

@ -87,8 +87,24 @@ RValue CodeGenFunction::EmitReferenceBindingToExpr(const Expr* E,
return RValue::get(LV.getAddress());
Val = EmitLoadOfLValue(LV, E->getType());
} else {
// FIXME: Initializers don't work with casts yet. For example
// const A& a = B();
// if B inherits from A.
Val = EmitAnyExprToTemp(E, /*IsAggLocVolatile=*/false,
IsInitializer);
// We might have to destroy the temporary variable.
if (const RecordType *RT = E->getType()->getAs<RecordType>()) {
if (CXXRecordDecl *ClassDecl = dyn_cast<CXXRecordDecl>(RT->getDecl())) {
if (!ClassDecl->hasTrivialDestructor()) {
const CXXDestructorDecl *Dtor =
ClassDecl->getDestructor(getContext());
CleanupScope scope(*this);
EmitCXXDestructorCall(Dtor, Dtor_Complete, Val.getAggregateAddr());
}
}
}
}
if (Val.isAggregate()) {