================
@@ -6107,6 +6109,44 @@ static bool isFromSystemHeader(SourceManager &SM, const 
Decl *D) {
          SM.isInSystemMacro(D->getLocation());
 }
 
+constexpr unsigned countCPlusPlusKeywords() {
+  unsigned Ret = 0;
+#define MODULES_KEYWORD(NAME)
+#define KEYWORD(NAME, FLAGS) ++Ret;
+#define CXX_KEYWORD_OPERATOR(NAME, TOK) ++Ret;
+#include "clang/Basic/TokenKinds.def"
+  return Ret;
+}
+
+static bool isKeywordInCPlusPlus(const Sema &S, const IdentifierInfo *II) {
+  if (!II)
+    return false;
+
+  // Build a static map of identifiers for all of the keywords in C++ that are
+  // not keywords in C. This allows us to do pointer comparisons instead of
+  // string comparisons when deciding whether the given identifier is a keyword
+  // or not. Note, this treats all keywords as being enabled, regardless of the
+  // setting of other language options. It intentionally disables the modules
+  // keywords because those are conditional keywords, so may be safe to use.
+  static auto Keywords = [&S] {
+    std::array<uintptr_t, countCPlusPlusKeywords()> Ret;
+    unsigned Idx = 0;
+#define MODULES_KEYWORD(NAME)
+#define KEYWORD(NAME, FLAGS)                                                   
\
+  Ret[Idx++] = reinterpret_cast<uint64_t>(                                     
\
+      &S.getPreprocessor().getIdentifierTable().get(#NAME));
+#define CXX_KEYWORD_OPERATOR(NAME, TOK)                                        
\
+  Ret[Idx++] = reinterpret_cast<uint64_t>(                                     
\
+      &S.getPreprocessor().getIdentifierTable().get(#NAME));
+#include "clang/Basic/TokenKinds.def"
+    assert(Idx == Ret.size() && "expected to fill every member!");
+    llvm::sort(Ret);
+    return Ret;
+  }();
+
+  return llvm::binary_search(Keywords, reinterpret_cast<uintptr_t>(II));
----------------
AaronBallman wrote:

Good suggestion, I've gone ahead with those changes.

https://github.com/llvm/llvm-project/pull/137234
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to