================
@@ -6107,6 +6109,43 @@ 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 std::array<uintptr_t, countCPlusPlusKeywords()> Keywords = {};
+  if (!Keywords[0]) {
+    unsigned Idx = 0;
+#define MODULES_KEYWORD(NAME)
+#define KEYWORD(NAME, FLAGS)                                                   
\
+  Keywords[Idx++] = reinterpret_cast<uint64_t>(                                
\
+      &S.getPreprocessor().getIdentifierTable().get(#NAME));
+#define CXX_KEYWORD_OPERATOR(NAME, TOK)                                        
\
+  Keywords[Idx++] = reinterpret_cast<uint64_t>(                                
\
+      &S.getPreprocessor().getIdentifierTable().get(#NAME));
+#include "clang/Basic/TokenKinds.def"
+    assert(Idx == Keywords.size() && "expected to fill every member!");
+    llvm::sort(Keywords);
----------------
efriedma-quic wrote:

Thread safety in the sense that we want to allow running multiple instances of 
the parser in the same process, yes.

Are IdentifierInfo pointers equal across different instances of the parser?  If 
they are... you can probably do something with a static constructor.  
ManagedStatic is probably overkill here; just use a lambda in the initializer.

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