diff options
| author | Anders Carlsson <andersca@mac.com> | 2009-05-17 18:41:29 +0000 |
|---|---|---|
| committer | Anders Carlsson <andersca@mac.com> | 2009-05-17 18:41:29 +0000 |
| commit | 85a307dffb5859d5559d654e2b92daca394e3497 (patch) | |
| tree | b10d469b3de822e945c08f7a3b5bb236c94fbdc2 /clang/lib/Sema/SemaExprCXX.cpp | |
| parent | 5262746c280993c80525afdbcd93d5a10dfccd6a (diff) | |
| download | bcm5719-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.cpp | 25 |
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); +} |

