diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/include/clang/AST/Stmt.h | 5 | ||||
| -rw-r--r-- | clang/lib/AST/Stmt.cpp | 8 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateStmt.cpp | 11 | ||||
| -rw-r--r-- | clang/test/SemaTemplate/instantiate-function-1.cpp | 4 |
4 files changed, 28 insertions, 0 deletions
diff --git a/clang/include/clang/AST/Stmt.h b/clang/include/clang/AST/Stmt.h index c4af23441be..1159ef3ffa6 100644 --- a/clang/include/clang/AST/Stmt.h +++ b/clang/include/clang/AST/Stmt.h @@ -873,6 +873,9 @@ public: virtual SourceRange getSourceRange() const { return SourceRange(ContinueLoc); } + + ContinueStmt* Clone(ASTContext &C) const; + static bool classof(const Stmt *T) { return T->getStmtClass() == ContinueStmtClass; } @@ -898,6 +901,8 @@ public: virtual SourceRange getSourceRange() const { return SourceRange(BreakLoc); } + BreakStmt* Clone(ASTContext &C) const; + static bool classof(const Stmt *T) { return T->getStmtClass() == BreakStmtClass; } diff --git a/clang/lib/AST/Stmt.cpp b/clang/lib/AST/Stmt.cpp index f8f6e067e1a..71103b83e3c 100644 --- a/clang/lib/AST/Stmt.cpp +++ b/clang/lib/AST/Stmt.cpp @@ -102,6 +102,14 @@ NullStmt* NullStmt::Clone(ASTContext &C) const { return new (C) NullStmt(SemiLoc); } +ContinueStmt* ContinueStmt::Clone(ASTContext &C) const { + return new (C) ContinueStmt(ContinueLoc); +} + +BreakStmt* BreakStmt::Clone(ASTContext &C) const { + return new (C) BreakStmt(BreakLoc); +} + void CompoundStmt::setStmts(ASTContext &C, Stmt **Stmts, unsigned NumStmts) { if (this->Body) C.Deallocate(Body); diff --git a/clang/lib/Sema/SemaTemplateInstantiateStmt.cpp b/clang/lib/Sema/SemaTemplateInstantiateStmt.cpp index c7682342ff0..d59f85953f8 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateStmt.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateStmt.cpp @@ -46,6 +46,8 @@ namespace { OwningStmtResult VisitExpr(Expr *E); OwningStmtResult VisitLabelStmt(LabelStmt *S); OwningStmtResult VisitGotoStmt(GotoStmt *S); + OwningStmtResult VisitBreakStmt(BreakStmt *S); + OwningStmtResult VisitContinueStmt(ContinueStmt *S); OwningStmtResult VisitReturnStmt(ReturnStmt *S); // Base case. I'm supposed to ignore this. @@ -99,6 +101,15 @@ Sema::OwningStmtResult TemplateStmtInstantiator::VisitGotoStmt(GotoStmt *S) { S->getLabel()->getID()); } +Sema::OwningStmtResult TemplateStmtInstantiator::VisitBreakStmt(BreakStmt *S) { + return SemaRef.Owned(S->Clone(SemaRef.Context)); +} + +Sema::OwningStmtResult +TemplateStmtInstantiator::VisitContinueStmt(ContinueStmt *S) { + return SemaRef.Owned(S->Clone(SemaRef.Context)); +} + Sema::OwningStmtResult TemplateStmtInstantiator::VisitReturnStmt(ReturnStmt *S) { Sema::OwningExprResult Result = SemaRef.ExprEmpty(); diff --git a/clang/test/SemaTemplate/instantiate-function-1.cpp b/clang/test/SemaTemplate/instantiate-function-1.cpp index 523860239c3..dc485980505 100644 --- a/clang/test/SemaTemplate/instantiate-function-1.cpp +++ b/clang/test/SemaTemplate/instantiate-function-1.cpp @@ -116,6 +116,10 @@ template struct Do0<NotConvertibleToBool>; // expected-note{{instantiation}} template<typename T> struct For0 { void f(T f, T l) { for (; f != l; ++f) { + if (*f) + continue; + else if (*f == 17) + break; } } }; |

