From: Anders Carlsson Date: Tue, 18 Aug 2009 16:11:00 +0000 (+0000) Subject: Change ActOnReturnStmt to not take a FullExprArg. Instead, Sema will wrap the return... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f53b4433abb7a3bc14c0329d3175cbc291280137;p=clang Change ActOnReturnStmt to not take a FullExprArg. Instead, Sema will wrap the return expr inside a CXXExprWithTemporaries if needed. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@79342 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Parse/Action.h b/include/clang/Parse/Action.h index 8706139988..70f5dbb929 100644 --- a/include/clang/Parse/Action.h +++ b/include/clang/Parse/Action.h @@ -641,7 +641,7 @@ public: return StmtEmpty(); } virtual OwningStmtResult ActOnReturnStmt(SourceLocation ReturnLoc, - FullExprArg RetValExp) { + ExprArg RetValExp) { return StmtEmpty(); } virtual OwningStmtResult ActOnAsmStmt(SourceLocation AsmLoc, diff --git a/lib/Frontend/PrintParserCallbacks.cpp b/lib/Frontend/PrintParserCallbacks.cpp index 9d6ea73eef..126cdd3fdd 100644 --- a/lib/Frontend/PrintParserCallbacks.cpp +++ b/lib/Frontend/PrintParserCallbacks.cpp @@ -374,7 +374,7 @@ namespace { return StmtEmpty(); } virtual OwningStmtResult ActOnReturnStmt(SourceLocation ReturnLoc, - FullExprArg RetValExp) { + ExprArg RetValExp) { Out << __FUNCTION__ << "\n"; return StmtEmpty(); } diff --git a/lib/Parse/ParseStmt.cpp b/lib/Parse/ParseStmt.cpp index 955f00d7a0..4a7bd57d78 100644 --- a/lib/Parse/ParseStmt.cpp +++ b/lib/Parse/ParseStmt.cpp @@ -1085,7 +1085,7 @@ Parser::OwningStmtResult Parser::ParseReturnStatement() { return StmtError(); } } - return Actions.ActOnReturnStmt(ReturnLoc, Actions.FullExpr(R)); + return Actions.ActOnReturnStmt(ReturnLoc, move(R)); } /// FuzzyParseMicrosoftAsmStatement. When -fms-extensions is enabled, this diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index d3bdec8f39..9230531b31 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -1366,7 +1366,7 @@ public: Scope *CurScope); virtual OwningStmtResult ActOnReturnStmt(SourceLocation ReturnLoc, - FullExprArg RetValExp); + ExprArg RetValExp); OwningStmtResult ActOnBlockReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp); diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp index 579433849e..d1bb0df00d 100644 --- a/lib/Sema/SemaStmt.cpp +++ b/lib/Sema/SemaStmt.cpp @@ -867,8 +867,8 @@ static bool IsReturnCopyElidable(ASTContext &Ctx, QualType RetType, } Action::OwningStmtResult -Sema::ActOnReturnStmt(SourceLocation ReturnLoc, FullExprArg rex) { - Expr *RetValExp = rex->takeAs(); +Sema::ActOnReturnStmt(SourceLocation ReturnLoc, ExprArg rex) { + Expr *RetValExp = rex.takeAs(); if (CurBlock) return ActOnBlockReturnStmt(ReturnLoc, RetValExp); @@ -897,6 +897,8 @@ Sema::ActOnReturnStmt(SourceLocation ReturnLoc, FullExprArg rex) { << CurDecl->getDeclName() << isa(CurDecl) << RetValExp->getSourceRange(); } + + RetValExp = MaybeCreateCXXExprWithTemporaries(RetValExp, true); } return Owned(new (Context) ReturnStmt(ReturnLoc, RetValExp)); } @@ -945,6 +947,8 @@ Sema::ActOnReturnStmt(SourceLocation ReturnLoc, FullExprArg rex) { if (RetValExp) CheckReturnStackAddr(RetValExp, FnRetType, ReturnLoc); } + if (RetValExp) + RetValExp = MaybeCreateCXXExprWithTemporaries(RetValExp, true); return Owned(new (Context) ReturnStmt(ReturnLoc, RetValExp)); } diff --git a/lib/Sema/SemaTemplateInstantiateStmt.cpp b/lib/Sema/SemaTemplateInstantiateStmt.cpp index 80ff5eb082..b42b84d795 100644 --- a/lib/Sema/SemaTemplateInstantiateStmt.cpp +++ b/lib/Sema/SemaTemplateInstantiateStmt.cpp @@ -130,7 +130,7 @@ TemplateStmtInstantiator::VisitReturnStmt(ReturnStmt *S) { return SemaRef.StmtError(); } - return SemaRef.ActOnReturnStmt(S->getReturnLoc(), FullExpr(Result)); + return SemaRef.ActOnReturnStmt(S->getReturnLoc(), move(Result)); } Sema::OwningStmtResult