[clang] [C] Diagnose use of C++ keywords in C (PR #137234)
Aaron Ballman via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 28 08:46:02 PDT 2025
================
@@ -6107,6 +6109,29 @@ static bool isFromSystemHeader(SourceManager &SM, const Decl *D) {
SM.isInSystemMacro(D->getLocation());
}
+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 llvm::SmallPtrSet<IdentifierInfo *, 32> Keywords;
+ if (Keywords.empty()) {
+#define MODULES_KEYWORD(NAME)
+#define KEYWORD(NAME, FLAGS) \
+ Keywords.insert(&S.getPreprocessor().getIdentifierTable().get(#NAME));
+#define CXX_KEYWORD_OPERATOR(NAME, TOK) \
+ Keywords.insert(&S.getPreprocessor().getIdentifierTable().get(#NAME));
+#include "clang/Basic/TokenKinds.def"
+ }
+
+ return Keywords.contains(II);
----------------
AaronBallman wrote:
I'd really rather not try to muck about with the layout of things in the identifier table, that's actually some pretty complicated logic because of "interesting identifiers" and Objective-C. I think the current perf is reasonable given that the checking only happens if the (off by default) diagnostic is enabled. WDYT?
https://github.com/llvm/llvm-project/pull/137234
More information about the cfe-commits
mailing list