[cfe-commits] r61652 - /cfe/trunk/lib/Parse/ParseDecl.cpp

Chris Lattner sabre at nondot.org
Sun Jan 4 15:41:41 PST 2009


Author: lattner
Date: Sun Jan  4 17:41:41 2009
New Revision: 61652

URL: http://llvm.org/viewvc/llvm-project?rev=61652&view=rev
Log:
sink calls to TryAnnotateTypeOrScopeToken down into the only cases that they 
can interact with.

Modified:
    cfe/trunk/lib/Parse/ParseDecl.cpp

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

==============================================================================
--- cfe/trunk/lib/Parse/ParseDecl.cpp (original)
+++ cfe/trunk/lib/Parse/ParseDecl.cpp Sun Jan  4 17:41:41 2009
@@ -700,12 +700,28 @@
 bool Parser::MaybeParseTypeSpecifier(DeclSpec &DS, int& isInvalid,
                                      const char *&PrevSpec,
                                      TemplateParameterLists *TemplateParams) {
-  // Annotate typenames and C++ scope specifiers.
-  TryAnnotateTypeOrScopeToken();
-
   SourceLocation Loc = Tok.getLocation();
 
   switch (Tok.getKind()) {
+  case tok::identifier:   // foo::bar
+    // Annotate typenames and C++ scope specifiers.  If we get one, just
+    // recurse to handle whatever we get.
+    if (TryAnnotateTypeOrScopeToken())
+      return MaybeParseTypeSpecifier(DS, isInvalid, PrevSpec, TemplateParams);
+    // Otherwise, not a type specifier.
+    return false;
+  case tok::coloncolon:   // ::foo::bar
+    if (NextToken().is(tok::kw_new) ||    // ::new
+        NextToken().is(tok::kw_delete))   // ::delete
+      return false;
+    
+    // Annotate typenames and C++ scope specifiers.  If we get one, just
+    // recurse to handle whatever we get.
+    if (TryAnnotateTypeOrScopeToken())
+      return MaybeParseTypeSpecifier(DS, isInvalid, PrevSpec, TemplateParams);
+    // Otherwise, not a type specifier.
+    return false;
+      
   // simple-type-specifier:
   case tok::annot_qualtypename: {
     isInvalid = DS.SetTypeSpecType(DeclSpec::TST_typedef, Loc, PrevSpec,
@@ -1171,11 +1187,28 @@
 /// isTypeSpecifierQualifier - Return true if the current token could be the
 /// start of a specifier-qualifier-list.
 bool Parser::isTypeSpecifierQualifier() {
-  // Annotate typenames and C++ scope specifiers.
-  TryAnnotateTypeOrScopeToken();
-
   switch (Tok.getKind()) {
   default: return false;
+      
+  case tok::identifier:   // foo::bar
+    // Annotate typenames and C++ scope specifiers.  If we get one, just
+    // recurse to handle whatever we get.
+    if (TryAnnotateTypeOrScopeToken())
+      return isTypeSpecifierQualifier();
+    // Otherwise, not a type specifier.
+    return false;
+  case tok::coloncolon:   // ::foo::bar
+    if (NextToken().is(tok::kw_new) ||    // ::new
+        NextToken().is(tok::kw_delete))   // ::delete
+      return false;
+
+    // Annotate typenames and C++ scope specifiers.  If we get one, just
+    // recurse to handle whatever we get.
+    if (TryAnnotateTypeOrScopeToken())
+      return isTypeSpecifierQualifier();
+    // Otherwise, not a type specifier.
+    return false;
+      
     // GNU attributes support.
   case tok::kw___attribute:
     // GNU typeof support.
@@ -1230,11 +1263,28 @@
 /// isDeclarationSpecifier() - Return true if the current token is part of a
 /// declaration specifier.
 bool Parser::isDeclarationSpecifier() {
-  // Annotate typenames and C++ scope specifiers.
-  TryAnnotateTypeOrScopeToken();
-
   switch (Tok.getKind()) {
   default: return false;
+    
+  case tok::identifier:   // foo::bar
+    // Annotate typenames and C++ scope specifiers.  If we get one, just
+    // recurse to handle whatever we get.
+    if (TryAnnotateTypeOrScopeToken())
+      return isDeclarationSpecifier();
+    // Otherwise, not a declaration specifier.
+    return false;
+  case tok::coloncolon:   // ::foo::bar
+    if (NextToken().is(tok::kw_new) ||    // ::new
+        NextToken().is(tok::kw_delete))   // ::delete
+      return false;
+    
+    // Annotate typenames and C++ scope specifiers.  If we get one, just
+    // recurse to handle whatever we get.
+    if (TryAnnotateTypeOrScopeToken())
+      return isDeclarationSpecifier();
+    // Otherwise, not a declaration specifier.
+    return false;
+      
     // storage-class-specifier
   case tok::kw_typedef:
   case tok::kw_extern:





More information about the cfe-commits mailing list