From: Benjamin Kramer Date: Sun, 8 Mar 2015 18:11:59 +0000 (+0000) Subject: Make Token a real POD type. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2772787360868a7899bf7f24025ad0f1c176a80f;p=clang 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@231603 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Lex/Token.h b/include/clang/Lex/Token.h index 4a53c9c1bb..2df5c2dae6 100644 --- a/include/clang/Lex/Token.h +++ b/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/lib/Parse/ParseExprCXX.cpp b/lib/Parse/ParseExprCXX.cpp index 6cff1c5997..1030072068 100644 --- a/lib/Parse/ParseExprCXX.cpp +++ b/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)) {