diff --git a/clang/include/clang/Basic/AttributeCommonInfo.h b/clang/include/clang/Basic/AttributeCommonInfo.h --- a/clang/include/clang/Basic/AttributeCommonInfo.h +++ b/clang/include/clang/Basic/AttributeCommonInfo.h @@ -14,6 +14,7 @@ #ifndef LLVM_CLANG_BASIC_ATTRIBUTECOMMONINFO_H #define LLVM_CLANG_BASIC_ATTRIBUTECOMMONINFO_H #include "clang/Basic/SourceLocation.h" +#include "clang/Basic/TokenKinds.h" namespace clang { class IdentifierInfo; @@ -87,6 +88,8 @@ constexpr Form(Syntax SyntaxUsed, unsigned SpellingIndex = SpellingNotCalculated) : SyntaxUsed(SyntaxUsed), SpellingIndex(SpellingIndex) {} + constexpr Form(tok::TokenKind) + : SyntaxUsed(AS_Keyword), SpellingIndex(SpellingNotCalculated) {} Syntax getSyntax() const { return Syntax(SyntaxUsed); } unsigned getSpellingIndex() const { return SpellingIndex; } diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -828,7 +828,8 @@ void Parser::ParseMicrosoftTypeAttributes(ParsedAttributes &attrs) { // Treat these like attributes while (true) { - switch (Tok.getKind()) { + auto Kind = Tok.getKind(); + switch (Kind) { case tok::kw___fastcall: case tok::kw___stdcall: case tok::kw___thiscall: @@ -843,7 +844,7 @@ IdentifierInfo *AttrName = Tok.getIdentifierInfo(); SourceLocation AttrNameLoc = ConsumeToken(); attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0, - ParsedAttr::AS_Keyword); + Kind); break; } default: @@ -865,7 +866,7 @@ SourceLocation AttrNameLoc = ConsumeToken(); attrs.addNew(AttrName, AttrNameLoc, /*ScopeName=*/nullptr, /*ScopeLoc=*/SourceLocation{}, /*Args=*/nullptr, /*numArgs=*/0, - ParsedAttr::AS_Keyword); + tok::kw___funcref); } void Parser::DiagnoseAndSkipExtendedMicrosoftTypeAttributes() { @@ -910,7 +911,7 @@ IdentifierInfo *AttrName = Tok.getIdentifierInfo(); SourceLocation AttrNameLoc = ConsumeToken(); attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0, - ParsedAttr::AS_Keyword); + tok::kw___pascal); } } @@ -920,7 +921,7 @@ IdentifierInfo *AttrName = Tok.getIdentifierInfo(); SourceLocation AttrNameLoc = ConsumeToken(); attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0, - ParsedAttr::AS_Keyword); + tok::kw___kernel); } } @@ -929,7 +930,7 @@ IdentifierInfo *AttrName = Tok.getIdentifierInfo(); SourceLocation AttrNameLoc = ConsumeToken(); attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0, - ParsedAttr::AS_Keyword); + tok::kw___noinline__); } } @@ -937,7 +938,7 @@ IdentifierInfo *AttrName = Tok.getIdentifierInfo(); SourceLocation AttrNameLoc = Tok.getLocation(); Attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0, - ParsedAttr::AS_Keyword); + Tok.getKind()); } bool Parser::isHLSLQualifier(const Token &Tok) const { @@ -946,15 +947,16 @@ void Parser::ParseHLSLQualifiers(ParsedAttributes &Attrs) { IdentifierInfo *AttrName = Tok.getIdentifierInfo(); + auto Kind = Tok.getKind(); SourceLocation AttrNameLoc = ConsumeToken(); - Attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0, - ParsedAttr::AS_Keyword); + Attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0, Kind); } void Parser::ParseNullabilityTypeSpecifiers(ParsedAttributes &attrs) { // Treat these like attributes, even though they're type specifiers. while (true) { - switch (Tok.getKind()) { + auto Kind = Tok.getKind(); + switch (Kind) { case tok::kw__Nonnull: case tok::kw__Nullable: case tok::kw__Nullable_result: @@ -965,7 +967,7 @@ Diag(AttrNameLoc, diag::ext_nullability) << AttrName; attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0, - ParsedAttr::AS_Keyword); + Kind); break; } default: @@ -3018,6 +3020,7 @@ "Not an alignment-specifier!"); IdentifierInfo *KWName = Tok.getIdentifierInfo(); + auto Kind = Tok.getKind(); SourceLocation KWLoc = ConsumeToken(); BalancedDelimiterTracker T(*this, tok::l_paren); @@ -3037,8 +3040,8 @@ ArgsVector ArgExprs; ArgExprs.push_back(ArgExpr.get()); - Attrs.addNew(KWName, KWLoc, nullptr, KWLoc, ArgExprs.data(), 1, - ParsedAttr::AS_Keyword, EllipsisLoc); + Attrs.addNew(KWName, KWLoc, nullptr, KWLoc, ArgExprs.data(), 1, Kind, + EllipsisLoc); } ExprResult Parser::ParseExtIntegerArgument() { @@ -3832,7 +3835,7 @@ IdentifierInfo *AttrName = Tok.getIdentifierInfo(); SourceLocation AttrNameLoc = Tok.getLocation(); DS.getAttributes().addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, - nullptr, 0, ParsedAttr::AS_Keyword); + nullptr, 0, tok::kw___forceinline); break; } @@ -3885,7 +3888,7 @@ // Objective-C 'kindof' types. case tok::kw___kindof: DS.getAttributes().addNew(Tok.getIdentifierInfo(), Loc, nullptr, Loc, - nullptr, 0, ParsedAttr::AS_Keyword); + nullptr, 0, tok::kw___kindof); (void)ConsumeToken(); continue; @@ -5978,7 +5981,7 @@ // Objective-C 'kindof' types. case tok::kw___kindof: DS.getAttributes().addNew(Tok.getIdentifierInfo(), Loc, nullptr, Loc, - nullptr, 0, ParsedAttr::AS_Keyword); + nullptr, 0, tok::kw___kindof); (void)ConsumeToken(); continue; diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp --- a/clang/lib/Parse/ParseDeclCXX.cpp +++ b/clang/lib/Parse/ParseDeclCXX.cpp @@ -1370,9 +1370,9 @@ tok::kw___multiple_inheritance, tok::kw___virtual_inheritance)) { IdentifierInfo *AttrName = Tok.getIdentifierInfo(); + auto Kind = Tok.getKind(); SourceLocation AttrNameLoc = ConsumeToken(); - attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0, - ParsedAttr::AS_Keyword); + attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0, Kind); } } diff --git a/clang/lib/Parse/ParseExprCXX.cpp b/clang/lib/Parse/ParseExprCXX.cpp --- a/clang/lib/Parse/ParseExprCXX.cpp +++ b/clang/lib/Parse/ParseExprCXX.cpp @@ -1300,7 +1300,7 @@ SourceLocation AttrNameLoc = ConsumeToken(); Attributes.addNew(AttrName, AttrNameLoc, /*ScopeName=*/nullptr, AttrNameLoc, /*ArgsUnion=*/nullptr, - /*numArgs=*/0, ParsedAttr::AS_Keyword); + /*numArgs=*/0, tok::kw___noinline__); } else if (Tok.is(tok::kw___attribute)) ParseGNUAttributes(Attributes, /*LatePArsedAttrList=*/nullptr, &D); else