diff options
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); } |