From d503c1c531250322350ede1b06f0d4a1fc8697ad Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Sun, 8 Mar 2015 18:11:59 +0000 Subject: [PATCH] Make Token a real POD type. We copy them around a lot and skip construction in favor of startToken, make the default construction trivial to reflect that. llvm-svn: 231603 --- clang/include/clang/Lex/Token.h | 14 +++++++++----- clang/lib/Parse/ParseExprCXX.cpp | 1 + 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/clang/include/clang/Lex/Token.h b/clang/include/clang/Lex/Token.h index 4a53c9c..2df5c2d 100644 --- a/clang/include/clang/Lex/Token.h +++ b/clang/include/clang/Lex/Token.h @@ -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::value, "Token should be a POD type!"); + /// \brief Information about the conditional stack (\#if directives) /// currently active. struct PPConditionalInfo { diff --git a/clang/lib/Parse/ParseExprCXX.cpp b/clang/lib/Parse/ParseExprCXX.cpp index 6cff1c5..1030072 100644 --- a/clang/lib/Parse/ParseExprCXX.cpp +++ b/clang/lib/Parse/ParseExprCXX.cpp @@ -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)) { -- 2.7.4