[PATCH] D151741: [Lex] Only warn on defining or undefining language-defined builtins
John Brawn via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed May 31 07:11:43 PDT 2023
john.brawn updated this revision to Diff 527024.
john.brawn added a comment.
Add more testing.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D151741/new/
https://reviews.llvm.org/D151741
Files:
clang/lib/Lex/PPDirectives.cpp
clang/test/Preprocessor/macro-reserved.c
Index: clang/test/Preprocessor/macro-reserved.c
===================================================================
--- clang/test/Preprocessor/macro-reserved.c
+++ clang/test/Preprocessor/macro-reserved.c
@@ -7,6 +7,7 @@
#define _HAVE_X 0
#define X__Y
#define __STDC__ 1 // expected-warning {{redefining builtin macro}}
+#define __clang__ 1
#undef for
#undef final
@@ -15,6 +16,12 @@
#undef _HAVE_X
#undef X__Y
#undef __STDC_HOSTED__ // expected-warning {{undefining builtin macro}}
+#undef __INT32_TYPE__
+#undef __UINT32_TYPE__
+#undef __UINTPTR_TYPE__
+#undef __i386__
+#undef __UINT64_TYPE__
+#undef __INT64_TYPE__
// allowlisted definitions
#define while while
Index: clang/lib/Lex/PPDirectives.cpp
===================================================================
--- clang/lib/Lex/PPDirectives.cpp
+++ clang/lib/Lex/PPDirectives.cpp
@@ -150,6 +150,30 @@
MacroName);
}
+static bool isLanguageDefinedBuiltin(const SourceManager &SourceMgr,
+ const MacroInfo *MI,
+ const StringRef MacroName) {
+ // If this is a macro with special handling (like __LINE__) then it's language
+ // defined.
+ if (MI->isBuiltinMacro())
+ return true;
+ // Builtin macros are defined in the builtin file
+ if (!SourceMgr.isWrittenInBuiltinFile(MI->getDefinitionLoc()))
+ return false;
+ // C defines macros starting with __STDC, and C++ defines macros starting with
+ // __STDCPP
+ if (MacroName.startswith("__STDC"))
+ return true;
+ // C++ defines the __cplusplus macro
+ if (MacroName == "__cplusplus")
+ return true;
+ // C++ defines various feature-test macros starting with __cpp
+ if (MacroName.startswith("__cpp"))
+ return true;
+ // Anything else isn't language-defined
+ return false;
+}
+
static MacroDiag shouldWarnOnMacroDef(Preprocessor &PP, IdentifierInfo *II) {
const LangOptions &Lang = PP.getLangOpts();
StringRef Text = II->getName();
@@ -3107,9 +3131,7 @@
// Warn if defining "__LINE__" and other builtins, per C99 6.10.8/4 and
// C++ [cpp.predefined]p4, but allow it as an extension.
- if (OtherMI->isBuiltinMacro() ||
- (SourceMgr.isWrittenInBuiltinFile(OtherMI->getDefinitionLoc()) &&
- !isFeatureTestMacro(MacroNameTok.getIdentifierInfo()->getName())))
+ if (isLanguageDefinedBuiltin(SourceMgr, OtherMI, II->getName()))
Diag(MacroNameTok, diag::ext_pp_redef_builtin_macro);
// Macros must be identical. This means all tokens and whitespace
// separation must be the same. C99 6.10.3p2.
@@ -3190,11 +3212,8 @@
Diag(MI->getDefinitionLoc(), diag::pp_macro_not_used);
// Warn if undefining "__LINE__" and other builtins, per C99 6.10.8/4 and
- // C++ [cpp.predefined]p4, but allow it as an extension. Don't warn if this
- // is an Objective-C builtin macro though.
- if ((MI->isBuiltinMacro() ||
- SourceMgr.isWrittenInBuiltinFile(MI->getDefinitionLoc())) &&
- !(getLangOpts().ObjC && isObjCProtectedMacro(II)))
+ // C++ [cpp.predefined]p4, but allow it as an extension.
+ if (isLanguageDefinedBuiltin(SourceMgr, MI, II->getName()))
Diag(MacroNameTok, diag::ext_pp_undef_builtin_macro);
if (MI->isWarnIfUnused())
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D151741.527024.patch
Type: text/x-patch
Size: 3304 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230531/90ef4490/attachment.bin>
More information about the cfe-commits
mailing list