Index: clang/lib/Lex/PPDirectives.cpp =================================================================== --- clang/lib/Lex/PPDirectives.cpp +++ clang/lib/Lex/PPDirectives.cpp @@ -121,8 +121,21 @@ static MacroDiag shouldWarnOnMacroDef(Preprocessor &PP, IdentifierInfo *II) { const LangOptions &Lang = PP.getLangOpts(); - if (II->isReserved(Lang) != ReservedIdentifierStatus::NotReserved) + if (II->isReserved(Lang) != ReservedIdentifierStatus::NotReserved) { + static constexpr std::array ReservedMacro = { + "_ATFILE_SOURCE", "_BSD_SOURCE", "_FILE_OFFSET_BITS", + "_FORTIFY_SOURCE", "_GNU_SOURCE", "_ISOC11_SOURCE", + "_ISOC95_SOURCE", "_ISOC99_SOURCE", "_LARGEFILE64_SOURCE", + "_POSIX_C_SOURCE", "_REENTRANT", "_SVID_SOURCE", + "_THREAD_SAFE", "_XOPEN_SOURCE", "_XOPEN_SOURCE_EXTENDED", + "__STDC_FORMAT_MACROS", + }; + if (std::binary_search(ReservedMacro.begin(), ReservedMacro.end(), + II->getName())) + return MD_NoWarn; + return MD_ReservedMacro; + } StringRef Text = II->getName(); if (II->isKeyword(Lang)) return MD_KeywordDef; Index: clang/test/Preprocessor/macro-reserved.c =================================================================== --- clang/test/Preprocessor/macro-reserved.c +++ clang/test/Preprocessor/macro-reserved.c @@ -62,3 +62,6 @@ #undef X__Y int x; + +#define _GNU_SOURCE // no-warning +#define __STDC_FORMAT_MACROS // no-warning