Use a scoped object to manage entry/exit from a parser scope rather than explicitly calling EnterScope/ExitScope
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60830 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Parse/ParseStmt.cpp b/lib/Parse/ParseStmt.cpp
index f244e4b..8b5277b 100644
--- a/lib/Parse/ParseStmt.cpp
+++ b/lib/Parse/ParseStmt.cpp
@@ -333,12 +333,10 @@
// Enter a scope to hold everything within the compound stmt. Compound
// statements can always hold declarations.
- EnterScope(Scope::DeclScope);
+ ParseScope CompoundScope(this, Scope::DeclScope);
// Parse the statements in the body.
OwningStmtResult Body(Actions, ParseCompoundStatementBody(isStmtExpr));
-
- ExitScope();
return Body.result();
}
@@ -446,8 +444,7 @@
// while, for, and switch statements are local to the if, while, for, or
// switch statement (including the controlled statement).
//
- if (C99orCXX)
- EnterScope(Scope::DeclScope | Scope::ControlScope);
+ ParseScope IfScope(this, Scope::DeclScope | Scope::ControlScope, C99orCXX);
// Parse the condition.
OwningExprResult CondExp(Actions);
@@ -461,8 +458,6 @@
if (CondExp.isInvalid()) {
SkipUntil(tok::semi);
- if (C99orCXX)
- ExitScope();
return true;
}
@@ -484,15 +479,15 @@
// would have to notify ParseStatement not to create a new scope. It's
// simpler to let it create a new scope.
//
- bool NeedsInnerScope = C99orCXX && Tok.isNot(tok::l_brace);
- if (NeedsInnerScope) EnterScope(Scope::DeclScope);
+ ParseScope InnerScope(this, Scope::DeclScope,
+ C99orCXX && Tok.isNot(tok::l_brace));
// Read the 'then' stmt.
SourceLocation ThenStmtLoc = Tok.getLocation();
OwningStmtResult ThenStmt(Actions, ParseStatement());
// Pop the 'if' scope if needed.
- if (NeedsInnerScope) ExitScope();
+ InnerScope.Exit();
// If it has an else, parse it.
SourceLocation ElseLoc;
@@ -511,18 +506,17 @@
// The substatement in a selection-statement (each substatement, in the else
// form of the if statement) implicitly defines a local scope.
//
- NeedsInnerScope = C99orCXX && Tok.isNot(tok::l_brace);
- if (NeedsInnerScope) EnterScope(Scope::DeclScope);
+ ParseScope InnerScope(this, Scope::DeclScope,
+ C99orCXX && Tok.isNot(tok::l_brace));
ElseStmtLoc = Tok.getLocation();
ElseStmt = ParseStatement();
// Pop the 'else' scope if needed.
- if (NeedsInnerScope) ExitScope();
+ InnerScope.Exit();
}
- if (C99orCXX)
- ExitScope();
+ IfScope.Exit();
// If the then or else stmt is invalid and the other is valid (and present),
// make turn the invalid one into a null stmt to avoid dropping the other
@@ -572,10 +566,10 @@
// while, for, and switch statements are local to the if, while, for, or
// switch statement (including the controlled statement).
//
- if (C99orCXX)
- EnterScope(Scope::BreakScope | Scope::DeclScope | Scope::ControlScope);
- else
- EnterScope(Scope::BreakScope);
+ unsigned ScopeFlags
+ = C99orCXX? Scope::BreakScope | Scope::DeclScope | Scope::ControlScope
+ : Scope::BreakScope;
+ ParseScope SwitchScope(this, ScopeFlags);
// Parse the condition.
OwningExprResult Cond(Actions);
@@ -587,10 +581,8 @@
Cond = ParseSimpleParenExpression();
}
- if (Cond.isInvalid()) {
- ExitScope();
+ if (Cond.isInvalid())
return true;
- }
OwningStmtResult Switch(Actions,
Actions.ActOnStartOfSwitchStmt(Cond.release()));
@@ -606,21 +598,21 @@
// See comments in ParseIfStatement for why we create a scope for the
// condition and a new scope for substatement in C++.
//
- bool NeedsInnerScope = C99orCXX && Tok.isNot(tok::l_brace);
- if (NeedsInnerScope) EnterScope(Scope::DeclScope);
+ ParseScope InnerScope(this, Scope::DeclScope,
+ C99orCXX && Tok.isNot(tok::l_brace));
// Read the body statement.
OwningStmtResult Body(Actions, ParseStatement());
// Pop the body scope if needed.
- if (NeedsInnerScope) ExitScope();
+ InnerScope.Exit();
if (Body.isInvalid()) {
Body = Actions.ActOnNullStmt(Tok.getLocation());
// FIXME: Remove the case statement list from the Switch statement.
}
-
- ExitScope();
+
+ SwitchScope.Exit();
return Actions.ActOnFinishSwitchStmt(SwitchLoc, Switch.release(),
Body.release());
@@ -655,11 +647,13 @@
// while, for, and switch statements are local to the if, while, for, or
// switch statement (including the controlled statement).
//
+ unsigned ScopeFlags;
if (C99orCXX)
- EnterScope(Scope::BreakScope | Scope::ContinueScope |
- Scope::DeclScope | Scope::ControlScope);
+ ScopeFlags = Scope::BreakScope | Scope::ContinueScope |
+ Scope::DeclScope | Scope::ControlScope;
else
- EnterScope(Scope::BreakScope | Scope::ContinueScope);
+ ScopeFlags = Scope::BreakScope | Scope::ContinueScope;
+ ParseScope WhileScope(this, ScopeFlags);
// Parse the condition.
OwningExprResult Cond(Actions);
@@ -682,16 +676,15 @@
// See comments in ParseIfStatement for why we create a scope for the
// condition and a new scope for substatement in C++.
//
- bool NeedsInnerScope = C99orCXX && Tok.isNot(tok::l_brace);
- if (NeedsInnerScope) EnterScope(Scope::DeclScope);
+ ParseScope InnerScope(this, Scope::DeclScope,
+ C99orCXX && Tok.isNot(tok::l_brace));
// Read the body statement.
OwningStmtResult Body(Actions, ParseStatement());
// Pop the body scope if needed.
- if (NeedsInnerScope) ExitScope();
-
- ExitScope();
+ InnerScope.Exit();
+ WhileScope.Exit();
if (Cond.isInvalid() || Body.isInvalid()) return true;
@@ -708,10 +701,13 @@
// C99 6.8.5p5 - In C99, the do statement is a block. This is not
// the case for C90. Start the loop scope.
+ unsigned ScopeFlags;
if (getLang().C99)
- EnterScope(Scope::BreakScope | Scope::ContinueScope | Scope::DeclScope);
+ ScopeFlags = Scope::BreakScope | Scope::ContinueScope | Scope::DeclScope;
else
- EnterScope(Scope::BreakScope | Scope::ContinueScope);
+ ScopeFlags = Scope::BreakScope | Scope::ContinueScope;
+
+ ParseScope DoScope(this, ScopeFlags);
// C99 6.8.5p5 - In C99, the body of the if statement is a scope, even if
// there is no compound stmt. C90 does not have this clause. We only do this
@@ -721,18 +717,17 @@
// The substatement in an iteration-statement implicitly defines a local scope
// which is entered and exited each time through the loop.
//
- bool NeedsInnerScope =
- (getLang().C99 || getLang().CPlusPlus) && Tok.isNot(tok::l_brace);
- if (NeedsInnerScope) EnterScope(Scope::DeclScope);
+ ParseScope InnerScope(this, Scope::DeclScope,
+ (getLang().C99 || getLang().CPlusPlus) &&
+ Tok.isNot(tok::l_brace));
// Read the body statement.
OwningStmtResult Body(Actions, ParseStatement());
// Pop the body scope if needed.
- if (NeedsInnerScope) ExitScope();
+ InnerScope.Exit();
if (Tok.isNot(tok::kw_while)) {
- ExitScope();
if (!Body.isInvalid()) {
Diag(Tok, diag::err_expected_while);
Diag(DoLoc, diag::note_matching) << "do";
@@ -743,7 +738,6 @@
SourceLocation WhileLoc = ConsumeToken();
if (Tok.isNot(tok::l_paren)) {
- ExitScope();
Diag(Tok, diag::err_expected_lparen_after) << "do/while";
SkipUntil(tok::semi, false, true);
return true;
@@ -751,8 +745,7 @@
// Parse the condition.
OwningExprResult Cond(Actions, ParseSimpleParenExpression());
-
- ExitScope();
+ DoScope.Exit();
if (Cond.isInvalid() || Body.isInvalid()) return true;
@@ -799,11 +792,14 @@
// Names declared in the for-init-statement are in the same declarative-region
// as those declared in the condition.
//
+ unsigned ScopeFlags;
if (C99orCXX)
- EnterScope(Scope::BreakScope | Scope::ContinueScope |
- Scope::DeclScope | Scope::ControlScope);
+ ScopeFlags = Scope::BreakScope | Scope::ContinueScope |
+ Scope::DeclScope | Scope::ControlScope;
else
- EnterScope(Scope::BreakScope | Scope::ContinueScope);
+ ScopeFlags = Scope::BreakScope | Scope::ContinueScope;
+
+ ParseScope ForScope(this, ScopeFlags);
SourceLocation LParenLoc = ConsumeParen();
OwningExprResult Value(Actions);
@@ -891,17 +887,17 @@
// See comments in ParseIfStatement for why we create a scope for
// for-init-statement/condition and a new scope for substatement in C++.
//
- bool NeedsInnerScope = C99orCXX && Tok.isNot(tok::l_brace);
- if (NeedsInnerScope) EnterScope(Scope::DeclScope);
+ ParseScope InnerScope(this, Scope::DeclScope,
+ C99orCXX && Tok.isNot(tok::l_brace));
// Read the body statement.
OwningStmtResult Body(Actions, ParseStatement());
// Pop the body scope if needed.
- if (NeedsInnerScope) ExitScope();
+ InnerScope.Exit();
// Leave the for-scope.
- ExitScope();
+ ForScope.Exit();
if (Body.isInvalid())
return true;
@@ -1214,8 +1210,5 @@
if (FnBody.isInvalid())
FnBody = Actions.ActOnCompoundStmt(L, R, 0, 0, false);
- // Leave the function body scope.
- ExitScope();
-
return Actions.ActOnFinishFunctionBody(Decl, FnBody.release());
}