]> granicus.if.org Git - clang/commitdiff
Make Token a real POD type.
authorBenjamin Kramer <benny.kra@googlemail.com>
Sun, 8 Mar 2015 18:11:59 +0000 (18:11 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Sun, 8 Mar 2015 18:11:59 +0000 (18:11 +0000)
We copy them around a lot and skip construction in favor of startToken,
make the default construction trivial to reflect that.

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

include/clang/Lex/Token.h
lib/Parse/ParseExprCXX.cpp

index 4a53c9c1bb190ad97ca094b47994a96a48ce2523..2df5c2dae6951fd6466ef2d787a0e2303f3a8c2e 100644 (file)
@@ -35,8 +35,8 @@ class IdentifierInfo;
 /// can be represented by a single typename annotation token that carries
 /// information about the SourceRange of the tokens and the type object.
 class Token {
-  /// The location of the token.
-  SourceLocation Loc;
+  /// The location of the token. This is actually a SourceLocation.
+  unsigned Loc;
 
   // Conceptually these next two fields could be in a union.  However, this
   // causes gcc 4.2 to pessimize LexTokenInternal, a very performance critical
@@ -114,13 +114,15 @@ public:
 
   /// \brief Return a source location identifier for the specified
   /// offset in the current file.
-  SourceLocation getLocation() const { return Loc; }
+  SourceLocation getLocation() const {
+    return SourceLocation::getFromRawEncoding(Loc);
+  }
   unsigned getLength() const {
     assert(!isAnnotation() && "Annotation tokens have no length field");
     return UintData;
   }
 
-  void setLocation(SourceLocation L) { Loc = L; }
+  void setLocation(SourceLocation L) { Loc = L.getRawEncoding(); }
   void setLength(unsigned Len) {
     assert(!isAnnotation() && "Annotation tokens have no length field");
     UintData = Len;
@@ -157,7 +159,7 @@ public:
     Flags = 0;
     PtrData = nullptr;
     UintData = 0;
-    Loc = SourceLocation();
+    Loc = SourceLocation().getRawEncoding();
   }
 
   IdentifierInfo *getIdentifierInfo() const {
@@ -285,6 +287,8 @@ public:
   }
 };
 
+static_assert(std::is_pod<Token>::value, "Token should be a POD type!");
+
 /// \brief Information about the conditional stack (\#if directives)
 /// currently active.
 struct PPConditionalInfo {
index 6cff1c5997517879bee6fb3e2fd5b5b42d2b24a1..1030072068ff69c50af255298934825bebf402f5 100644 (file)
@@ -118,6 +118,7 @@ void Parser::CheckForLParenAfterColonColon() {
   // Eat the '('.
   ConsumeParen();
   Token RParen;
+  RParen.setLocation(SourceLocation());
   // Do we have a ')' ?
   NextTok = StarTok.is(tok::star) ? GetLookAheadToken(2) : GetLookAheadToken(1);
   if (NextTok.is(tok::r_paren)) {