diff options
author | Anders Carlsson <andersca@mac.com> | 2009-06-05 15:38:08 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-06-05 15:38:08 +0000 |
commit | b3d05d6d113d06198d9dbd8c0209e68faffd97ff (patch) | |
tree | 2c42ae1e9de923bd545271303ec389b94ac5a621 /clang/lib/Sema | |
parent | 8b9524eede4a4e088c0c48701bec094a6b5a3697 (diff) | |
download | bcm5719-llvm-b3d05d6d113d06198d9dbd8c0209e68faffd97ff.tar.gz bcm5719-llvm-b3d05d6d113d06198d9dbd8c0209e68faffd97ff.zip |
Improvements to CXXExprWithTemporaries in preparation for fixing a bug with default arguments that have temporaries.
llvm-svn: 72944
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r-- | clang/lib/Sema/Sema.h | 6 | ||||
-rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 26 |
2 files changed, 24 insertions, 8 deletions
diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h index 736a496cff9..faf25710a43 100644 --- a/clang/lib/Sema/Sema.h +++ b/clang/lib/Sema/Sema.h @@ -1630,6 +1630,12 @@ public: TypeTy *Ty, SourceLocation RParen); + /// MaybeCreateCXXExprWithTemporaries - If the list of temporaries is + /// non-empty, will create a new CXXExprWithTemporaries expression. + /// Otherwise, just returs the passed in expression. + Expr *MaybeCreateCXXExprWithTemporaries(Expr *SubExpr, + bool DestroyTemps = true); + virtual OwningExprResult ActOnFinishFullExpr(ExprArg Expr); bool RequireCompleteDeclContext(const CXXScopeSpec &SS); diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 65018daff75..ed4ac555add 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -1588,16 +1588,26 @@ Expr *Sema::RemoveOutermostTemporaryBinding(Expr *E) { return E; } +Expr *Sema::MaybeCreateCXXExprWithTemporaries(Expr *SubExpr, + bool DestroyTemps) { + assert(SubExpr && "sub expression can't be null!"); + + if (ExprTemporaries.empty()) + return SubExpr; + + Expr *E = CXXExprWithTemporaries::Create(Context, SubExpr, + &ExprTemporaries[0], + ExprTemporaries.size(), + DestroyTemps); + ExprTemporaries.clear(); + + return E; +} + Sema::OwningExprResult Sema::ActOnFinishFullExpr(ExprArg Arg) { Expr *FullExpr = Arg.takeAs<Expr>(); - - if (FullExpr && !ExprTemporaries.empty()) { - // Create a cleanup expr. - FullExpr = CXXExprWithTemporaries::Create(Context, FullExpr, - &ExprTemporaries[0], - ExprTemporaries.size()); - ExprTemporaries.clear(); - } + if (FullExpr) + FullExpr = MaybeCreateCXXExprWithTemporaries(FullExpr); return Owned(FullExpr); } |