summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaExprCXX.cpp
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-05-17 18:41:29 +0000
committerAnders Carlsson <andersca@mac.com>2009-05-17 18:41:29 +0000
commit85a307dffb5859d5559d654e2b92daca394e3497 (patch)
treeb10d469b3de822e945c08f7a3b5bb236c94fbdc2 /clang/lib/Sema/SemaExprCXX.cpp
parent5262746c280993c80525afdbcd93d5a10dfccd6a (diff)
downloadbcm5719-llvm-85a307dffb5859d5559d654e2b92daca394e3497.tar.gz
bcm5719-llvm-85a307dffb5859d5559d654e2b92daca394e3497.zip
Implement Sema::ActOnFinishFullExpr and create a CXXExprWithTemporaries node if necessary.
llvm-svn: 71983
Diffstat (limited to 'clang/lib/Sema/SemaExprCXX.cpp')
-rw-r--r--clang/lib/Sema/SemaExprCXX.cpp25
1 files changed, 23 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index f6ee0927da8..142f7132543 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -164,8 +164,11 @@ Sema::ActOnCXXTypeConstructExpr(SourceRange TypeRange, TypeTy *TypeRep,
CallExpr::hasAnyTypeDependentArguments(Exprs, NumExprs)) {
exprs.release();
- // FIXME: Is this correct?
+ // FIXME: Is this correct (I don't think so). Instead, we should have an
+ // CXXUnresolvedTemporaryObjectExpr node for this.
CXXTempVarDecl *Temp = CXXTempVarDecl::Create(Context, CurContext, Ty);
+ ExprTemporaries.push_back(Temp);
+
return Owned(new (Context) CXXTemporaryObjectExpr(Context, Temp, 0, Ty,
TyBeginLoc,
Exprs, NumExprs,
@@ -190,6 +193,8 @@ Sema::ActOnCXXTypeConstructExpr(SourceRange TypeRange, TypeTy *TypeRep,
if (const RecordType *RT = Ty->getAsRecordType()) {
CXXRecordDecl *Record = cast<CXXRecordDecl>(RT->getDecl());
+ // FIXME: We should always create a CXXTemporaryObjectExpr here unless
+ // both the ctor and dtor are trivial.
if (NumExprs > 1 || Record->hasUserDeclaredConstructor()) {
CXXConstructorDecl *Constructor
= PerformInitializationByConstructor(Ty, Exprs, NumExprs,
@@ -203,7 +208,8 @@ Sema::ActOnCXXTypeConstructExpr(SourceRange TypeRange, TypeTy *TypeRep,
return ExprError();
CXXTempVarDecl *Temp = CXXTempVarDecl::Create(Context, CurContext, Ty);
-
+ ExprTemporaries.push_back(Temp);
+
exprs.release();
return Owned(new (Context) CXXTemporaryObjectExpr(Context, Temp,
Constructor, Ty,
@@ -1494,3 +1500,18 @@ QualType Sema::FindCompositePointerType(Expr *&E1, Expr *&E2) {
}
return QualType();
}
+
+Sema::OwningExprResult Sema::ActOnFinishFullExpr(ExprArg Arg) {
+ Expr *FullExpr = Arg.takeAs<Expr>();
+ assert(FullExpr && "Null full expr!");
+
+ if (!ExprTemporaries.empty()) {
+ // Create a cleanup expr.
+ FullExpr =
+ new (Context) CXXExprWithTemporaries(FullExpr, &ExprTemporaries[0],
+ ExprTemporaries.size());
+ ExprTemporaries.clear();
+ }
+
+ return Owned(FullExpr);
+}
OpenPOWER on IntegriCloud