]> granicus.if.org Git - clang/commitdiff
Change Parser::ParseFunctionDeclarator() to annotate typename tokens.
authorSteve Naroff <snaroff@apple.com>
Wed, 28 Jan 2009 19:16:40 +0000 (19:16 +0000)
committerSteve Naroff <snaroff@apple.com>
Wed, 28 Jan 2009 19:16:40 +0000 (19:16 +0000)
This removes ~10% of the calls to Sema::isTypeName(), which amount to a little less than a 1% reduction in usertime (for Cocoa.h).

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63219 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Parse/ParseDecl.cpp

index 89e0f10d741c1e97d43a8efaef9e9c3590fbbfd8..dc6768f99936eeb169a4e4282d97aea327ca1308 100644 (file)
@@ -1992,18 +1992,30 @@ void Parser::ParseFunctionDeclarator(SourceLocation LParenLoc, Declarator &D,
   
   // Alternatively, this parameter list may be an identifier list form for a
   // K&R-style function:  void foo(a,b,c)
-  if (!getLang().CPlusPlus && Tok.is(tok::identifier) &&
+  if (!getLang().CPlusPlus && Tok.is(tok::identifier)) {
+
+    TypeTy *TypeRep = Actions.isTypeName(*Tok.getIdentifierInfo(), CurScope);
+    if (TypeRep) {
+      // This is a typename. Replace the current token in-place with an
+      // annotation type token.
+      Tok.setKind(tok::annot_typename);
+      Tok.setAnnotationValue(TypeRep);
+      Tok.setAnnotationEndLoc(Tok.getLocation());
+      // In case the tokens were cached, have Preprocessor replace
+      // them with the annotation token.
+      PP.AnnotateCachedTokens(Tok);
+    } else {
       // K&R identifier lists can't have typedefs as identifiers, per
       // C99 6.7.5.3p11.
-      !Actions.isTypeName(*Tok.getIdentifierInfo(), CurScope)) {
-    if (RequiresArg) {
-      Diag(Tok, diag::err_argument_required_after_attribute);
-      delete AttrList;
+      if (RequiresArg) {
+        Diag(Tok, diag::err_argument_required_after_attribute);
+        delete AttrList;
+      }
+      
+      // Identifier list.  Note that '(' identifier-list ')' is only allowed for
+      // normal declarators, not for abstract-declarators.
+      return ParseFunctionDeclaratorIdentifierList(LParenLoc, D);
     }
-    
-    // Identifier list.  Note that '(' identifier-list ')' is only allowed for
-    // normal declarators, not for abstract-declarators.
-    return ParseFunctionDeclaratorIdentifierList(LParenLoc, D);
   }
   
   // Finally, a normal, non-empty parameter type list.