diff options
| author | Anders Carlsson <andersca@mac.com> | 2009-05-15 00:48:27 +0000 |
|---|---|---|
| committer | Anders Carlsson <andersca@mac.com> | 2009-05-15 00:48:27 +0000 |
| commit | 19b8c4ce365f636f3e20aa03ed1a940d844e944a (patch) | |
| tree | 336f9264e8f0e29a902c74cd8b409bac9345969e /clang/lib/Sema/SemaTemplateInstantiateExpr.cpp | |
| parent | 2c002929b2afc4c064bdd29bceae9f439f243a6e (diff) | |
| download | bcm5719-llvm-19b8c4ce365f636f3e20aa03ed1a940d844e944a.tar.gz bcm5719-llvm-19b8c4ce365f636f3e20aa03ed1a940d844e944a.zip | |
Instantiate return statements.
llvm-svn: 71825
Diffstat (limited to 'clang/lib/Sema/SemaTemplateInstantiateExpr.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateExpr.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp b/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp index 50d5d4442f1..401075da3f7 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp @@ -447,6 +447,7 @@ namespace { OwningStmtResult VisitExpr(Expr *E); OwningStmtResult VisitLabelStmt(LabelStmt *S); OwningStmtResult VisitGotoStmt(GotoStmt *S); + OwningStmtResult VisitReturnStmt(ReturnStmt *S); // Base case. I'm supposed to ignore this. OwningStmtResult VisitStmt(Stmt *S) { @@ -499,6 +500,19 @@ Sema::OwningStmtResult TemplateStmtInstantiator::VisitGotoStmt(GotoStmt *S) { S->getLabel()->getID()); } +Sema::OwningStmtResult +TemplateStmtInstantiator::VisitReturnStmt(ReturnStmt *S) { + Sema::OwningExprResult Result = SemaRef.ExprEmpty(); + if (Expr *E = S->getRetValue()) { + Result = SemaRef.InstantiateExpr(E, TemplateArgs); + + if (Result.isInvalid()) + return SemaRef.StmtError(); + } + + return SemaRef.ActOnReturnStmt(S->getReturnLoc(), move(Result)); +} + Sema::OwningStmtResult TemplateStmtInstantiator::VisitCompoundStmt(CompoundStmt *S) { // FIXME: We need an *easy* RAII way to delete these statements if |

