[cfe-commits] r60830 - in /cfe/trunk: include/clang/Parse/Parser.h lib/Parse/ParseCXXInlineMethods.cpp lib/Parse/ParseDecl.cpp lib/Parse/ParseDeclCXX.cpp lib/Parse/ParseExpr.cpp lib/Parse/ParseObjc.cpp lib/Parse/ParseStmt.cpp lib/Parse/ParseTemplate.cpp lib/Parse/Parser.cpp

Douglas Gregor dgregor at apple.com
Tue Dec 9 22:34:37 PST 2008


Author: dgregor
Date: Wed Dec 10 00:34:36 2008
New Revision: 60830

URL: http://llvm.org/viewvc/llvm-project?rev=60830&view=rev
Log:
Use a scoped object to manage entry/exit from a parser scope rather than explicitly calling EnterScope/ExitScope

Modified:
    cfe/trunk/include/clang/Parse/Parser.h
    cfe/trunk/lib/Parse/ParseCXXInlineMethods.cpp
    cfe/trunk/lib/Parse/ParseDecl.cpp
    cfe/trunk/lib/Parse/ParseDeclCXX.cpp
    cfe/trunk/lib/Parse/ParseExpr.cpp
    cfe/trunk/lib/Parse/ParseObjc.cpp
    cfe/trunk/lib/Parse/ParseStmt.cpp
    cfe/trunk/lib/Parse/ParseTemplate.cpp
    cfe/trunk/lib/Parse/Parser.cpp

Modified: cfe/trunk/include/clang/Parse/Parser.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Parser.h?rev=60830&r1=60829&r2=60830&view=diff

==============================================================================
--- cfe/trunk/include/clang/Parse/Parser.h (original)
+++ cfe/trunk/include/clang/Parse/Parser.h Wed Dec 10 00:34:36 2008
@@ -305,6 +305,44 @@
   //===--------------------------------------------------------------------===//
   // Scope manipulation
   
+  /// ParseScope - Introduces a new scope for parsing. The kind of
+  /// scope is determined by ScopeFlags. Objects of this type should
+  /// be created on the stack to coincide with the position where the
+  /// parser enters the new scope, and this object's constructor will
+  /// create that new scope. Similarly, once the object is destroyed
+  /// the parser will exit the scope.
+  class ParseScope {
+    Parser *Self;
+    ParseScope(const ParseScope&); // do not implement
+    ParseScope& operator=(const ParseScope&); // do not implement
+
+  public:
+    // ParseScope - Construct a new object to manage a scope in the
+    // parser Self where the new Scope is created with the flags
+    // ScopeFlags, but only when ManageScope is true (the default). If
+    // ManageScope is false, this object does nothing.
+    ParseScope(Parser *Self, unsigned ScopeFlags, bool ManageScope = true) 
+      : Self(Self) {
+      if (ManageScope)
+        Self->EnterScope(ScopeFlags);
+      else
+        this->Self = 0;
+    }
+
+    // Exit - Exit the scope associated with this object now, rather
+    // than waiting until the object is destroyed.
+    void Exit() {
+      if (Self) {
+        Self->ExitScope();
+        Self = 0;
+      }
+    }
+
+    ~ParseScope() {
+      Exit();
+    }
+  };
+
   /// EnterScope - Start a new scope.
   void EnterScope(unsigned ScopeFlags);
   

Modified: cfe/trunk/lib/Parse/ParseCXXInlineMethods.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseCXXInlineMethods.cpp?rev=60830&r1=60829&r2=60830&view=diff

==============================================================================
--- cfe/trunk/lib/Parse/ParseCXXInlineMethods.cpp (original)
+++ cfe/trunk/lib/Parse/ParseCXXInlineMethods.cpp Wed Dec 10 00:34:36 2008
@@ -65,7 +65,7 @@
 /// (non-nested) C++ class. Now go over the stack of lexed methods that were
 /// collected during its parsing and parse them all.
 void Parser::ParseLexedMethodDefs() {
-  while (!getCurTopClassStack().empty()) {
+  for (; !getCurTopClassStack().empty(); getCurTopClassStack().pop()) {
     LexedMethod &LM = getCurTopClassStack().top();
 
     assert(!LM.Toks.empty() && "Empty body!");
@@ -81,15 +81,13 @@
 
     // Parse the method body. Function body parsing code is similar enough
     // to be re-used for method bodies as well.
-    EnterScope(Scope::FnScope|Scope::DeclScope);
+    ParseScope FnScope(this, Scope::FnScope|Scope::DeclScope);
     Actions.ActOnStartOfFunctionDef(CurScope, LM.D);
 
     if (Tok.is(tok::colon))
       ParseConstructorInitializer(LM.D);
 
     ParseFunctionStatementBody(LM.D, Tok.getLocation(), Tok.getLocation());
-
-    getCurTopClassStack().pop();
   }
 }
 

Modified: cfe/trunk/lib/Parse/ParseDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=60830&r1=60829&r2=60830&view=diff

==============================================================================
--- cfe/trunk/lib/Parse/ParseDecl.cpp (original)
+++ cfe/trunk/lib/Parse/ParseDecl.cpp Wed Dec 10 00:34:36 2008
@@ -1728,7 +1728,7 @@
 
   // Enter function-declaration scope, limiting any declarators to the
   // function prototype scope, including parameter declarators.
-  EnterScope(Scope::FnScope|Scope::DeclScope);
+  ParseScope PrototypeScope(this, Scope::FnScope|Scope::DeclScope);
   
   bool IsVariadic = false;
   while (1) {
@@ -1818,7 +1818,7 @@
   }
   
   // Leave prototype scope.
-  ExitScope();
+  PrototypeScope.Exit();
   
   // If we have the closing ')', eat it.
   MatchRHSPunctuation(tok::r_paren, LParenLoc);

Modified: cfe/trunk/lib/Parse/ParseDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDeclCXX.cpp?rev=60830&r1=60829&r2=60830&view=diff

==============================================================================
--- cfe/trunk/lib/Parse/ParseDeclCXX.cpp (original)
+++ cfe/trunk/lib/Parse/ParseDeclCXX.cpp Wed Dec 10 00:34:36 2008
@@ -67,7 +67,7 @@
     SourceLocation LBrace = ConsumeBrace();
 
     // Enter a scope for the namespace.
-    EnterScope(Scope::DeclScope);
+    ParseScope NamespaceScope(this, Scope::DeclScope);
 
     DeclTy *NamespcDecl =
       Actions.ActOnStartNamespaceDef(CurScope, IdentLoc, Ident, LBrace);
@@ -76,7 +76,7 @@
       ParseExternalDeclaration();
     
     // Leave the namespace scope.
-    ExitScope();
+    NamespaceScope.Exit();
 
     SourceLocation RBrace = MatchRHSPunctuation(tok::r_brace, LBrace);
     Actions.ActOnFinishNamespaceDef(NamespcDecl, RBrace);
@@ -590,7 +590,7 @@
   }
 
   // Enter a scope for the class.
-  EnterScope(Scope::CXXClassScope|Scope::DeclScope);
+  ParseScope ClassScope(this, Scope::CXXClassScope|Scope::DeclScope);
 
   Actions.ActOnStartCXXClassDef(CurScope, TagDecl, LBraceLoc);
 
@@ -659,7 +659,7 @@
   }
 
   // Leave the class scope.
-  ExitScope();
+  ClassScope.Exit();
 
   Actions.ActOnFinishCXXClassDef(TagDecl);
 }

Modified: cfe/trunk/lib/Parse/ParseExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseExpr.cpp?rev=60830&r1=60829&r2=60830&view=diff

==============================================================================
--- cfe/trunk/lib/Parse/ParseExpr.cpp (original)
+++ cfe/trunk/lib/Parse/ParseExpr.cpp Wed Dec 10 00:34:36 2008
@@ -1159,8 +1159,8 @@
   // argument decls, decls within the compound expression, etc.  This also
   // allows determining whether a variable reference inside the block is
   // within or outside of the block.
-  EnterScope(Scope::BlockScope|Scope::FnScope|Scope::BreakScope|
-             Scope::ContinueScope|Scope::DeclScope);
+  ParseScope BlockScope(this, Scope::BlockScope|Scope::FnScope|Scope::BreakScope|
+                              Scope::ContinueScope|Scope::DeclScope);
 
   // Inform sema that we are starting a block.
   Actions.ActOnBlockStart(CaretLoc, CurScope);
@@ -1179,7 +1179,6 @@
       // If there was an error parsing the arguments, they may have tried to use
       // ^(x+y) which requires an argument list.  Just skip the whole block
       // literal.
-      ExitScope();
       return true;
     }
   } else {
@@ -1200,7 +1199,6 @@
       Actions.ActOnBlockError(CaretLoc, CurScope);
     }
   }
-  ExitScope();
   return Result.result();
 }
 

Modified: cfe/trunk/lib/Parse/ParseObjc.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseObjc.cpp?rev=60830&r1=60829&r2=60830&view=diff

==============================================================================
--- cfe/trunk/lib/Parse/ParseObjc.cpp (original)
+++ cfe/trunk/lib/Parse/ParseObjc.cpp Wed Dec 10 00:34:36 2008
@@ -1214,11 +1214,11 @@
   }
   // Enter a scope to hold everything within the compound stmt.  Compound
   // statements can always hold declarations.
-  EnterScope(Scope::DeclScope);
+  ParseScope BodyScope(this, Scope::DeclScope);
 
   OwningStmtResult SynchBody(Actions, ParseCompoundStatementBody());
 
-  ExitScope();
+  BodyScope.Exit();
   if (SynchBody.isInvalid())
     SynchBody = Actions.ActOnNullStmt(Tok.getLocation());
   return Actions.ActOnObjCAtSynchronizedStmt(atLoc, Res.release(),
@@ -1246,9 +1246,9 @@
   }
   OwningStmtResult CatchStmts(Actions);
   OwningStmtResult FinallyStmt(Actions);
-  EnterScope(Scope::DeclScope);
+  ParseScope TryScope(this, Scope::DeclScope);
   OwningStmtResult TryBody(Actions, ParseCompoundStatementBody());
-  ExitScope();
+  TryScope.Exit();
   if (TryBody.isInvalid())
     TryBody = Actions.ActOnNullStmt(Tok.getLocation());
 
@@ -1267,7 +1267,7 @@
       ConsumeToken(); // consume catch
       if (Tok.is(tok::l_paren)) {
         ConsumeParen();
-        EnterScope(Scope::DeclScope);
+        ParseScope CatchScope(this, Scope::DeclScope);
         if (Tok.isNot(tok::ellipsis)) {
           DeclSpec DS;
           ParseDeclarationSpecifiers(DS);
@@ -1297,7 +1297,6 @@
         CatchStmts = Actions.ActOnObjCAtCatchStmt(AtCatchFinallyLoc,
           RParenLoc, FirstPart.release(), CatchBody.release(),
           CatchStmts.release());
-        ExitScope();
       } else {
         Diag(AtCatchFinallyLoc, diag::err_expected_lparen_after)
           << "@catch clause";
@@ -1307,8 +1306,7 @@
     } else {
       assert(Tok.isObjCAtKeyword(tok::objc_finally) && "Lookahead confused?");
       ConsumeToken(); // consume finally
-      EnterScope(Scope::DeclScope);
-
+      ParseScope FinallyScope(this, Scope::DeclScope);
 
       OwningStmtResult FinallyBody(Actions, true);
       if (Tok.is(tok::l_brace))
@@ -1320,7 +1318,6 @@
       FinallyStmt = Actions.ActOnObjCAtFinallyStmt(AtCatchFinallyLoc,
                                                    FinallyBody.release());
       catch_or_finally_seen = true;
-      ExitScope();
       break;
     }
   }
@@ -1355,7 +1352,7 @@
   SourceLocation BraceLoc = Tok.getLocation();
   
   // Enter a scope for the method body.
-  EnterScope(Scope::FnScope|Scope::DeclScope);
+  ParseScope BodyScope(this, Scope::FnScope|Scope::DeclScope);
   
   // Tell the actions module that we have entered a method definition with the
   // specified Declarator for the method.
@@ -1368,7 +1365,7 @@
     FnBody = Actions.ActOnCompoundStmt(BraceLoc, BraceLoc, 0, 0, false);
   
   // Leave the function body scope.
-  ExitScope();
+  BodyScope.Exit();
   
   // TODO: Pass argument information.
   Actions.ActOnFinishFunctionBody(MDecl, FnBody.release());

Modified: cfe/trunk/lib/Parse/ParseStmt.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseStmt.cpp?rev=60830&r1=60829&r2=60830&view=diff

==============================================================================
--- cfe/trunk/lib/Parse/ParseStmt.cpp (original)
+++ cfe/trunk/lib/Parse/ParseStmt.cpp Wed Dec 10 00:34:36 2008
@@ -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());
 }

Modified: cfe/trunk/lib/Parse/ParseTemplate.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseTemplate.cpp?rev=60830&r1=60829&r2=60830&view=diff

==============================================================================
--- cfe/trunk/lib/Parse/ParseTemplate.cpp (original)
+++ cfe/trunk/lib/Parse/ParseTemplate.cpp Wed Dec 10 00:34:36 2008
@@ -41,7 +41,7 @@
   SourceLocation TemplateLoc = ConsumeToken();
   
   // Enter template-parameter scope.
-  EnterScope(Scope::TemplateParamScope);
+  ParseScope TemplateParmScope(this, Scope::TemplateParamScope);
 
   // Try to parse the template parameters, and the declaration if
   // successful.
@@ -49,9 +49,6 @@
   if(ParseTemplateParameters(0))
     TemplateDecl = ParseDeclarationOrFunctionDefinition();
 
-  // Leave template-parameter scope.
-  ExitScope();
-
   return TemplateDecl;
 }
 

Modified: cfe/trunk/lib/Parse/Parser.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/Parser.cpp?rev=60830&r1=60829&r2=60830&view=diff

==============================================================================
--- cfe/trunk/lib/Parse/Parser.cpp (original)
+++ cfe/trunk/lib/Parse/Parser.cpp Wed Dec 10 00:34:36 2008
@@ -287,7 +287,7 @@
 ///         external-declaration
 ///         translation-unit external-declaration
 void Parser::ParseTranslationUnit() {
-  Initialize();  // pushes a scope.
+  Initialize();
 
   DeclTy *Res;
   while (!ParseTopLevelDecl(Res))
@@ -526,7 +526,7 @@
   }
 
   // Enter a scope for the function body.
-  EnterScope(Scope::FnScope|Scope::DeclScope);
+  ParseScope BodyScope(this, Scope::FnScope|Scope::DeclScope);
 
   // Tell the actions module that we have entered a function definition with the
   // specified Declarator for the function.
@@ -549,7 +549,7 @@
 
   // Enter function-declaration scope, limiting any declarators to the
   // function prototype scope, including parameter declarators.
-  EnterScope(Scope::FnScope|Scope::DeclScope);
+  ParseScope PrototypeScope(this, Scope::FnScope|Scope::DeclScope);
 
   // Read all the argument declarations.
   while (isDeclarationSpecifier()) {
@@ -653,9 +653,6 @@
     }
   }
 
-  // Leave prototype scope.
-  ExitScope();
-
   // The actions module must verify that all arguments were declared.
 }
 





More information about the cfe-commits mailing list