diff options
author | Anders Carlsson <andersca@mac.com> | 2009-05-15 00:15:26 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-05-15 00:15:26 +0000 |
commit | 137fa562caedf11df4bb10f2657651a785769ca7 (patch) | |
tree | dd2279f34deaf5af70d4a3396e0c5f3a45e063b4 | |
parent | 7c98736d8cf17bc05abfcd92f5ed390b2bbdd5be (diff) |
Instantiate goto and label statements. (Very useful, I know)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@71822 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaTemplateInstantiateExpr.cpp | 18 | ||||
-rw-r--r-- | test/SemaTemplate/instantiate-function-1.cpp | 11 |
2 files changed, 29 insertions, 0 deletions
diff --git a/lib/Sema/SemaTemplateInstantiateExpr.cpp b/lib/Sema/SemaTemplateInstantiateExpr.cpp index 2dca993f74..e747236204 100644 --- a/lib/Sema/SemaTemplateInstantiateExpr.cpp +++ b/lib/Sema/SemaTemplateInstantiateExpr.cpp @@ -445,6 +445,8 @@ namespace { OwningStmtResult VisitNullStmt(NullStmt *S); OwningStmtResult VisitCompoundStmt(CompoundStmt *S); OwningStmtResult VisitExpr(Expr *E); + OwningStmtResult VisitLabelStmt(LabelStmt *S); + OwningStmtResult VisitGotoStmt(GotoStmt *S); // Base case. I'm supposed to ignore this. OwningStmtResult VisitStmt(Stmt *S) { @@ -481,6 +483,22 @@ Sema::OwningStmtResult TemplateStmtInstantiator::VisitNullStmt(NullStmt *S) { return SemaRef.Owned(new (SemaRef.Context) NullStmt(S->getSemiLoc())); } +Sema::OwningStmtResult TemplateStmtInstantiator::VisitLabelStmt(LabelStmt *S) { + OwningStmtResult SubStmt = Visit(S->getSubStmt()); + + if (SubStmt.isInvalid()) + return SemaRef.StmtError(); + + // FIXME: Pass the real colon loc in. + return SemaRef.ActOnLabelStmt(S->getIdentLoc(), S->getID(), SourceLocation(), + move(SubStmt)); +} + +Sema::OwningStmtResult TemplateStmtInstantiator::VisitGotoStmt(GotoStmt *S) { + return SemaRef.ActOnGotoStmt(S->getGotoLoc(), S->getLabelLoc(), + S->getLabel()->getID()); +} + Sema::OwningStmtResult TemplateStmtInstantiator::VisitCompoundStmt(CompoundStmt *S) { // FIXME: We need an *easy* RAII way to delete these statements if diff --git a/test/SemaTemplate/instantiate-function-1.cpp b/test/SemaTemplate/instantiate-function-1.cpp index 6b755c8ea9..5ca3401948 100644 --- a/test/SemaTemplate/instantiate-function-1.cpp +++ b/test/SemaTemplate/instantiate-function-1.cpp @@ -26,3 +26,14 @@ struct X2 { template struct X2<int>; template struct X2<int&>; // expected-note{{instantiation of}} + +template<typename T> +struct X3 { + void f(T) { + Label: + T x; + goto Label; + } +}; + +template struct X3<int>; |