aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaExprCXX.cpp
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-05-30 20:36:53 +0000
committerAnders Carlsson <andersca@mac.com>2009-05-30 20:36:53 +0000
commitdef11996fb558f58a8a7ae87aa95eb0bb96bfe4a (patch)
treeaaea67ae165daa62be178506fd7665ab31c49055 /lib/Sema/SemaExprCXX.cpp
parentb859f35459ae3e1188d1e1b86df08d649695fd86 (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.cpp25
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!");