diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-05-20 22:57:03 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-05-20 22:57:03 +0000 |
commit | 66b46be52f82addd4edab3a54928e111dfa09de7 (patch) | |
tree | a40ca836cecc7a5accde63f76edf08daa4b46a73 /lib/Sema/SemaTemplateInstantiateStmt.cpp | |
parent | 767d649c5353ca19c5a1e181783240a0994bb20a (diff) |
Fix template instantiation for compound statements so that it properly
passes the "isStmtExpr" flag, to suppress warnings about unused
expressions.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72190 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaTemplateInstantiateStmt.cpp')
-rw-r--r-- | lib/Sema/SemaTemplateInstantiateStmt.cpp | 42 |
1 files changed, 26 insertions, 16 deletions
diff --git a/lib/Sema/SemaTemplateInstantiateStmt.cpp b/lib/Sema/SemaTemplateInstantiateStmt.cpp index e83718e33d..d635dff94c 100644 --- a/lib/Sema/SemaTemplateInstantiateStmt.cpp +++ b/lib/Sema/SemaTemplateInstantiateStmt.cpp @@ -136,22 +136,7 @@ TemplateStmtInstantiator::VisitReturnStmt(ReturnStmt *S) { Sema::OwningStmtResult TemplateStmtInstantiator::VisitCompoundStmt(CompoundStmt *S) { - ASTOwningVector<&ActionBase::DeleteStmt> Statements(SemaRef); - - for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end(); - B != BEnd; ++B) { - OwningStmtResult Result = Visit(*B); - if (Result.isInvalid()) - return SemaRef.StmtError(); - - Statements.push_back(Result.takeAs<Stmt>()); - } - - return SemaRef.ActOnCompoundStmt(S->getLBracLoc(), S->getRBracLoc(), - Sema::MultiStmtArg(SemaRef, - Statements.take(), - Statements.size()), - /*isStmtExpr=*/false); + return SemaRef.InstantiateCompoundStmt(S, TemplateArgs, false); } Sema::OwningStmtResult @@ -437,3 +422,28 @@ Sema::InstantiateStmt(Stmt *S, const TemplateArgumentList &TemplateArgs) { TemplateStmtInstantiator Instantiator(*this, TemplateArgs); return Instantiator.Visit(S); } + +Sema::OwningStmtResult +Sema::InstantiateCompoundStmt(CompoundStmt *S, + const TemplateArgumentList &TemplateArgs, + bool isStmtExpr) { + if (!S) + return Owned((Stmt *)0); + + TemplateStmtInstantiator Instantiator(*this, TemplateArgs); + ASTOwningVector<&ActionBase::DeleteStmt> Statements(*this); + for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end(); + B != BEnd; ++B) { + OwningStmtResult Result = Instantiator.Visit(*B); + if (Result.isInvalid()) + return StmtError(); + + Statements.push_back(Result.takeAs<Stmt>()); + } + + return ActOnCompoundStmt(S->getLBracLoc(), S->getRBracLoc(), + Sema::MultiStmtArg(*this, + Statements.take(), + Statements.size()), + isStmtExpr); +} |