[cfe-commits] r47515 - in /cfe/trunk/include/clang: Basic/IdentifierTable.h Lex/Token.h

Ted Kremenek kremenek at apple.com
Fri Feb 22 17:05:55 PST 2008


Author: kremenek
Date: Fri Feb 22 19:05:54 2008
New Revision: 47515

URL: http://llvm.org/viewvc/llvm-project?rev=47515&view=rev
Log:
Change encoding of TokenKind in IdentifierTable to be of type "unsigned"
instead of TokenKind because of signedness issues with MSVC and enums.

Patch from Argiris Kirtzidis.

Modified:
    cfe/trunk/include/clang/Basic/IdentifierTable.h
    cfe/trunk/include/clang/Lex/Token.h

Modified: cfe/trunk/include/clang/Basic/IdentifierTable.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/IdentifierTable.h?rev=47515&r1=47514&r2=47515&view=diff

==============================================================================
--- cfe/trunk/include/clang/Basic/IdentifierTable.h (original)
+++ cfe/trunk/include/clang/Basic/IdentifierTable.h Fri Feb 22 19:05:54 2008
@@ -36,7 +36,9 @@
 /// variable or function name).  The preprocessor keeps this information in a
 /// set, and all tok::identifier tokens have a pointer to one of these.  
 class IdentifierInfo {
-  tok::TokenKind TokenID      : 8; // Front-end token ID or tok::identifier.
+  // Note: DON'T make TokenID a 'tok::TokenKind'; MSVC will treat it as a
+  //       signed char and TokenKinds > 127 won't be handled correctly.
+  unsigned TokenID            : 8; // Front-end token ID or tok::identifier. 
   unsigned BuiltinID          : 9; // ID if this is a builtin (__builtin_inf).
   tok::ObjCKeywordKind ObjCID : 5; // ID for objc @ keyword like @'protocol'.
   bool HasMacro               : 1; // True if there is a #define for this.
@@ -79,7 +81,7 @@
   /// get/setTokenID - If this is a source-language token (e.g. 'for'), this API
   /// can be used to cause the lexer to map identifiers to source-language
   /// tokens.
-  tok::TokenKind getTokenID() const { return TokenID; }
+  tok::TokenKind getTokenID() const { return (tok::TokenKind)TokenID; }
   void setTokenID(tok::TokenKind ID) { TokenID = ID; }
   
   /// getPPKeywordID - Return the preprocessor keyword ID for this identifier.

Modified: cfe/trunk/include/clang/Lex/Token.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/Token.h?rev=47515&r1=47514&r2=47515&view=diff

==============================================================================
--- cfe/trunk/include/clang/Lex/Token.h (original)
+++ cfe/trunk/include/clang/Lex/Token.h Fri Feb 22 19:05:54 2008
@@ -36,7 +36,9 @@
 
   /// Kind - The actual flavor of token this is.
   ///
-  tok::TokenKind Kind : 8;
+  unsigned Kind : 8;  // DON'T make Kind a 'tok::TokenKind'; 
+                      // MSVC will treat it as a signed char and
+                      // TokenKinds > 127 won't be handled correctly.
   
   /// Flags - Bits we track about this token, members of the TokenFlags enum.
   unsigned Flags : 8;
@@ -50,13 +52,13 @@
     NeedsCleaning = 0x08   // Contained an escaped newline or trigraph.
   };
 
-  tok::TokenKind getKind() const { return Kind; }
+  tok::TokenKind getKind() const { return (tok::TokenKind)Kind; }
   void setKind(tok::TokenKind K) { Kind = K; }
   
   /// is/isNot - Predicates to check if this token is a specific kind, as in
   /// "if (Tok.is(tok::l_brace)) {...}".
-  bool is(tok::TokenKind K) const { return Kind == K; }
-  bool isNot(tok::TokenKind K) const { return Kind != K; }
+  bool is(tok::TokenKind K) const { return Kind == (unsigned) K; }
+  bool isNot(tok::TokenKind K) const { return Kind != (unsigned) K; }
 
   /// getLocation - Return a source location identifier for the specified
   /// offset in the current file.
@@ -66,7 +68,9 @@
   void setLocation(SourceLocation L) { Loc = L; }
   void setLength(unsigned Len) { Length = Len; }
   
-  const char *getName() const { return tok::getTokenName(Kind); }
+  const char *getName() const {
+    return tok::getTokenName( (tok::TokenKind) Kind);
+  }
   
   /// startToken - Reset all flags to cleared.
   ///
@@ -113,7 +117,9 @@
   
   /// isExpandDisabled - Return true if this identifier token should never
   /// be expanded in the future, due to C99 6.10.3.4p2.
-  bool isExpandDisabled() const { return (Flags & DisableExpand) ? true : false; }
+  bool isExpandDisabled() const {
+    return (Flags & DisableExpand) ? true : false;
+  }
   
   /// isObjCAtKeyword - Return true if we have an ObjC keyword identifier. 
   bool isObjCAtKeyword(tok::ObjCKeywordKind objcKey) const;





More information about the cfe-commits mailing list