diff options
author | Anders Carlsson <andersca@mac.com> | 2009-05-30 20:36:53 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-05-30 20:36:53 +0000 |
commit | def11996fb558f58a8a7ae87aa95eb0bb96bfe4a (patch) | |
tree | aaea67ae165daa62be178506fd7665ab31c49055 /lib/Sema/SemaExprCXX.cpp | |
parent | b859f35459ae3e1188d1e1b86df08d649695fd86 (diff) |
Add Sema::MaybeBindToTemporary which takes an expression and (if needed) wraps it in a CXXBindTemporaryExpr. Use this when creating CXXTemporaryObjectExprs.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72629 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaExprCXX.cpp')
-rw-r--r-- | lib/Sema/SemaExprCXX.cpp | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index 923aa1d742..b6ccb99d6b 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/lib/Sema/SemaExprCXX.cpp @@ -207,10 +207,11 @@ Sema::ActOnCXXTypeConstructExpr(SourceRange TypeRange, TypeTy *TypeRep, ExprTemporaries.push_back(Temp); exprs.release(); - return Owned(new (Context) CXXTemporaryObjectExpr(Context, Temp, - Constructor, Ty, - TyBeginLoc, Exprs, - NumExprs, RParenLoc)); + + Expr *E = new (Context) CXXTemporaryObjectExpr(Context, Temp, Constructor, + Ty, TyBeginLoc, Exprs, + NumExprs, RParenLoc); + return MaybeBindToTemporary(E); } // Fall through to value-initialize an object of class type that @@ -1529,6 +1530,22 @@ QualType Sema::FindCompositePointerType(Expr *&E1, Expr *&E2) { return QualType(); } +Sema::OwningExprResult Sema::MaybeBindToTemporary(Expr *E) { + const RecordType *RT = E->getType()->getAsRecordType(); + if (!RT) + return Owned(E); + + CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl()); + if (RD->hasTrivialDestructor()) + return Owned(E); + + CXXTemporary *Temp = CXXTemporary::Create(Context, + RD->getDestructor(Context)); + + // FIXME: Add the temporary to the temporaries vector. + return Owned(CXXBindTemporaryExpr::Create(Context, Temp, E)); +} + Sema::OwningExprResult Sema::ActOnFinishFullExpr(ExprArg Arg) { Expr *FullExpr = Arg.takeAs<Expr>(); assert(FullExpr && "Null full expr!"); |