diff --git a/clang/include/clang/Basic/AttributeCommonInfo.h b/clang/include/clang/Basic/AttributeCommonInfo.h index d787e4959bfee..ef2ddf525c981 100644 --- a/clang/include/clang/Basic/AttributeCommonInfo.h +++ b/clang/include/clang/Basic/AttributeCommonInfo.h @@ -260,7 +260,7 @@ inline bool doesKeywordAttributeTakeArgs(tok::TokenKind Kind) { switch (Kind) { default: return false; -#define KEYWORD_ATTRIBUTE(NAME, HASARG) \ +#define KEYWORD_ATTRIBUTE(NAME, HASARG, ...) \ case tok::kw_##NAME: \ return HASARG; #include "clang/Basic/RegularKeywordAttrInfo.inc" diff --git a/clang/include/clang/Basic/TokenKinds.def b/clang/include/clang/Basic/TokenKinds.def index d15e4970b7d8f..c10e2adfbe6e9 100644 --- a/clang/include/clang/Basic/TokenKinds.def +++ b/clang/include/clang/Basic/TokenKinds.def @@ -760,8 +760,9 @@ KEYWORD(__builtin_available , KEYALL) KEYWORD(__builtin_sycl_unique_stable_name, KEYSYCL) // Keywords defined by Attr.td. +// The "EMPTY ## X" is used to prevent early macro-expansion of the keyword. #ifndef KEYWORD_ATTRIBUTE -#define KEYWORD_ATTRIBUTE(X, ...) KEYWORD(X, KEYALL) +#define KEYWORD_ATTRIBUTE(X, HASARG, EMPTY) KEYWORD(EMPTY ## X, KEYALL) #endif #include "clang/Basic/RegularKeywordAttrInfo.inc" diff --git a/clang/utils/TableGen/ClangAttrEmitter.cpp b/clang/utils/TableGen/ClangAttrEmitter.cpp index a1827f8ce0ead..3888e6c08ab0f 100644 --- a/clang/utils/TableGen/ClangAttrEmitter.cpp +++ b/clang/utils/TableGen/ClangAttrEmitter.cpp @@ -3589,7 +3589,7 @@ void EmitClangRegularKeywordAttributeInfo(RecordKeeper &Records, OS << "KEYWORD_ATTRIBUTE(" << S.getSpellingRecord().getValueAsString("Name") << ", " - << (HasArgs ? "true" : "false") << ")\n"; + << (HasArgs ? "true" : "false") << ", )\n"; } OS << "#undef KEYWORD_ATTRIBUTE\n"; }