From: Anders Carlsson Date: Sun, 16 Aug 2009 17:50:25 +0000 (+0000) Subject: Destroy bound temporaries. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8478ce6d3f2416a694e39f791655a473c3907d62;p=clang Destroy bound temporaries. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@79196 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/ExprCXX.h b/include/clang/AST/ExprCXX.h index 0f1354754b..c2efcd228f 100644 --- a/include/clang/AST/ExprCXX.h +++ b/include/clang/AST/ExprCXX.h @@ -486,7 +486,6 @@ class CXXConstructExpr : public Expr { Stmt **Args; unsigned NumArgs; - protected: CXXConstructExpr(ASTContext &C, StmtClass SC, QualType T, diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index 3818f56df9..ea534d3b2b 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -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()) { + if (CXXRecordDecl *ClassDecl = dyn_cast(RT->getDecl())) { + if (!ClassDecl->hasTrivialDestructor()) { + const CXXDestructorDecl *Dtor = + ClassDecl->getDestructor(getContext()); + + CleanupScope scope(*this); + EmitCXXDestructorCall(Dtor, Dtor_Complete, Val.getAggregateAddr()); + } + } + } } if (Val.isAggregate()) {