https://github.com/vvereschaka updated https://github.com/llvm/llvm-project/pull/194779
>From f12e9a46d194a36edd1dd0b6f62ec2a21cde7d8f Mon Sep 17 00:00:00 2001 From: Vladimir Vereschaka <[email protected]> Date: Tue, 28 Apr 2026 21:21:47 -0700 Subject: [PATCH 01/14] [clang-cl] Add cl compiler build deterministic options for compatibility. Added the following options: * /experimental:deterministic (emits clang -Wdate-time option) Emit warnings on usage of non-deterministic macros __DATE__, __TIME__ and __TIMESTAMP__ * /d1nodatetime (emits clang -Wno-builtin-macro-redefined option) Undefine the standard preprocessor macros __DATE__, __TIME__ and __TIMESTAMP__ --- clang/include/clang/Options/Options.td | 4 +++ clang/lib/Driver/ToolChains/Clang.cpp | 11 ++++++++ clang/test/Driver/cl-deterministic.c | 36 ++++++++++++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 clang/test/Driver/cl-deterministic.c diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td index 8f5ed945a40fe..899f5c42321a4 100644 --- a/clang/include/clang/Options/Options.td +++ b/clang/include/clang/Options/Options.td @@ -9334,6 +9334,10 @@ def : CLFlag<"Qgather-">, Alias<mno_gather>, HelpText<"Disable generation of gather instructions in auto-vectorization(x86 only)">; def : CLFlag<"Qscatter-">, Alias<mno_scatter>, HelpText<"Disable generation of scatter instructions in auto-vectorization(x86 only)">; +def _SLASH_experemental_deterministic : CLJoined<"experimental:deterministic">, + HelpText<"Emit warnings on usage of non-deterministic macros __DATE__, __TIME__ and __TIMESTAMP__">; +def _SLASH_d1nodatetime : CLFlag<"d1nodatetime">, + HelpText<"Undefine the standard preprocessor macros __DATE__, __TIME__ and __TIMESTAMP__">; // Non-aliases: diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index b25bddf5a94e8..36cae95148d7e 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -8896,6 +8896,17 @@ void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType, CmdArgs.push_back(Args.MakeArgString( Twine("-loader-replaceable-function=") + FuncOverride)); } + + if (Args.hasFlag(options::OPT__SLASH_experemental_deterministic, + options::OPT__SLASH_experemental_deterministic, false)) { + CmdArgs.push_back("-Wdate-time"); + } + + if (Args.hasFlag(options::OPT__SLASH_d1nodatetime, + options::OPT__SLASH_d1nodatetime, false)) { + CmdArgs.push_back("-Wno-builtin-macro-redefined"); + } + } const char *Clang::getBaseInputName(const ArgList &Args, diff --git a/clang/test/Driver/cl-deterministic.c b/clang/test/Driver/cl-deterministic.c new file mode 100644 index 0000000000000..2c3df5f37d014 --- /dev/null +++ b/clang/test/Driver/cl-deterministic.c @@ -0,0 +1,36 @@ +// We have to run the compilation step to see the output, so we must be able to +// target Windows. + +// REQUIRES: system-windows + +// RUN: %clang_cl -fno-integrated-cc1 -E /experimental:deterministic /d1nodatetime %s +// RUN: %clang_cl -fno-integrated-cc1 -E /D IS_SYSHEADER=1 /experimental:deterministic /d1nodatetime %s + +// RUN: %clang_cl -E /experimental:deterministic /d1nodatetime %s +// RUN: %clang_cl -E /D IS_SYSHEADER=1 /experimental:deterministic /d1nodatetime %s + +// not %clang_cc1 -Werror=date-time -Wno-builtin-macro-redefined %s -DIS_SYSHEADER -E 2>&1 | grep 'error: expansion' | count 3 + +// RUN: %clang_cl -E -### /experimental:deterministic %s 2>&1 | FileCheck %s --check-prefix=WDATETIME +// WDATETIME: -Wdate-time +// RUN: %clang_cl -E -### /d1nodatetime %s 2>&1 | FileCheck %s --check-prefix=MACROREDEF +// MACROREDEF: -Wno-builtin-macro-redefined + +#ifdef IS_HEADER + +#ifdef IS_SYSHEADER +#pragma clang system_header +#endif + +__TIME__ // expected-warning {{expansion of date or time macro is not reproducible}} +__DATE__ // expected-warning {{expansion of date or time macro is not reproducible}} +__TIMESTAMP__ // expected-warning {{expansion of date or time macro is not reproducible}} + +#define __TIME__ +__TIME__ + +#else + +#define IS_HEADER +#include __FILE__ +#endif \ No newline at end of file >From a493089b1f052e21a3c572fd9d6c2e6cf7b0ad60 Mon Sep 17 00:00:00 2001 From: Vladimir Vereschaka <[email protected]> Date: Tue, 28 Apr 2026 22:18:36 -0700 Subject: [PATCH 02/14] Clean up empty lines --- clang/lib/Driver/ToolChains/Clang.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 36cae95148d7e..c730d9586a7ec 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -8906,7 +8906,6 @@ void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType, options::OPT__SLASH_d1nodatetime, false)) { CmdArgs.push_back("-Wno-builtin-macro-redefined"); } - } const char *Clang::getBaseInputName(const ArgList &Args, >From d3b62eb2fea5e2c6deb550468f40ce14985f6ded Mon Sep 17 00:00:00 2001 From: Vladimir Vereschaka <[email protected]> Date: Thu, 14 May 2026 22:58:13 -0700 Subject: [PATCH 03/14] Updated CL's deterministic options: /experemental:determenistic, /d1nodatetime and /Brepro. --- clang/include/clang/Options/Options.td | 2 + clang/lib/Driver/ToolChains/Clang.cpp | 60 ++++++++++++++++++++++---- 2 files changed, 54 insertions(+), 8 deletions(-) diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td index 899f5c42321a4..5d3642a442e2d 100644 --- a/clang/include/clang/Options/Options.td +++ b/clang/include/clang/Options/Options.td @@ -9338,6 +9338,8 @@ def _SLASH_experemental_deterministic : CLJoined<"experimental:deterministic">, HelpText<"Emit warnings on usage of non-deterministic macros __DATE__, __TIME__ and __TIMESTAMP__">; def _SLASH_d1nodatetime : CLFlag<"d1nodatetime">, HelpText<"Undefine the standard preprocessor macros __DATE__, __TIME__ and __TIMESTAMP__">; +def _SLASH_d1nodatetime_ : CLFlag<"d1nodatetime-">, + HelpText<"Disable undefinition of the standard preprocessor macros __DATE__, __TIME__ and __TIMESTAMP__">; // Non-aliases: diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index c730d9586a7ec..fd859d2c21470 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -8897,15 +8897,59 @@ void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType, Twine("-loader-replaceable-function=") + FuncOverride)); } - if (Args.hasFlag(options::OPT__SLASH_experemental_deterministic, - options::OPT__SLASH_experemental_deterministic, false)) { - CmdArgs.push_back("-Wdate-time"); - } + auto findMacro = [&](const std::string &Macro, bool claim = false) { + for (const auto *A : Args.filtered(options::OPT_D, options::OPT_U)) { + const std::string v(A->getValue()); + if (v == Macro || v.find(Macro + '=') != std::string::npos) + if (claim) + A->claim(); + return true; + } + return false; + }; - if (Args.hasFlag(options::OPT__SLASH_d1nodatetime, - options::OPT__SLASH_d1nodatetime, false)) { - CmdArgs.push_back("-Wno-builtin-macro-redefined"); - } + if (Args.hasArg(options::OPT__SLASH_experemental_deterministic)) { + CmdArgs.push_back("-Wdate-time"); + + if (Args.hasArg(options::OPT_mincremental_linker_compatible)) { + D.Diag(diag::err_drv_argument_not_allowed_with) << "/experemental:determenistic" + << "/Brepro-"; + } + // CL's sets COFF's OBJ timestamp to a hash of the source file path to get deterministic + // result, but we force this timestamp to 0, which also produces determinitic result. + CmdArgs.push_back("-mno-incremental-linker-compatible"); + } + + if (Args.hasFlag(options::OPT__SLASH_d1nodatetime, + options::OPT__SLASH_d1nodatetime_, false)) { + // Allow user definitions for these macros from the command line. + CmdArgs.push_back("-Wno-builtin-macro-redefined"); + if (!findMacro("__DATE__")) + CmdArgs.push_back("-U__DATE__"); + if (!findMacro("__TIME__")) + CmdArgs.push_back("-U__TIME__"); + if (!findMacro("__TIMESTAMP__")) + CmdArgs.push_back("-U__TIMESTAMP__"); + } + + // /Brepro is an alias for -mincremental-linker-compatible option. + if (!Args.hasFlag(options::OPT_mincremental_linker_compatible, + options::OPT_mno_incremental_linker_compatible, + getToolChain().getTriple().isDefaultIncrementalLinkerCompatibleByDefault())) { + // Redefine the date/time macros only if /d1nodatetime wasn't specified. + // This options does not allow the user redifinitions for these macros. + if (!Args.hasFlag(options::OPT__SLASH_d1nodatetime, + options::OPT__SLASH_d1nodatetime_, false)) { + findMacro("__DATE__", true); + findMacro("__TIME__", true); + findMacro("__TIMESTAMP__", true); + + CmdArgs.push_back("-Wno-builtin-macro-redefined"); + CmdArgs.push_back("-D__DATE__=\"1\""); + CmdArgs.push_back("-D__TIME__=\"1\""); + CmdArgs.push_back("-D__TIMESTAMP__=\"1\""); + } + } } const char *Clang::getBaseInputName(const ArgList &Args, >From 94bc214d38b3d60205209100da58a6794d258ac9 Mon Sep 17 00:00:00 2001 From: Vladimir Vereschaka <[email protected]> Date: Thu, 14 May 2026 23:24:50 -0700 Subject: [PATCH 04/14] Fixed typos --- clang/include/clang/Options/Options.td | 2 +- clang/lib/Driver/ToolChains/Clang.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td index 5d3642a442e2d..912b3bc610f6a 100644 --- a/clang/include/clang/Options/Options.td +++ b/clang/include/clang/Options/Options.td @@ -9334,7 +9334,7 @@ def : CLFlag<"Qgather-">, Alias<mno_gather>, HelpText<"Disable generation of gather instructions in auto-vectorization(x86 only)">; def : CLFlag<"Qscatter-">, Alias<mno_scatter>, HelpText<"Disable generation of scatter instructions in auto-vectorization(x86 only)">; -def _SLASH_experemental_deterministic : CLJoined<"experimental:deterministic">, +def _SLASH_experimental_deterministic : CLJoined<"experimental:deterministic">, HelpText<"Emit warnings on usage of non-deterministic macros __DATE__, __TIME__ and __TIMESTAMP__">; def _SLASH_d1nodatetime : CLFlag<"d1nodatetime">, HelpText<"Undefine the standard preprocessor macros __DATE__, __TIME__ and __TIMESTAMP__">; diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index fd859d2c21470..04b8cbebd8993 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -8908,15 +8908,15 @@ void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType, return false; }; - if (Args.hasArg(options::OPT__SLASH_experemental_deterministic)) { + if (Args.hasArg(options::OPT__SLASH_experimental_deterministic)) { CmdArgs.push_back("-Wdate-time"); if (Args.hasArg(options::OPT_mincremental_linker_compatible)) { - D.Diag(diag::err_drv_argument_not_allowed_with) << "/experemental:determenistic" + D.Diag(diag::err_drv_argument_not_allowed_with) << "/experimental:deterministic" << "/Brepro-"; } // CL's sets COFF's OBJ timestamp to a hash of the source file path to get deterministic - // result, but we force this timestamp to 0, which also produces determinitic result. + // result, but we force this timestamp to 0, which also produces deterministic result. CmdArgs.push_back("-mno-incremental-linker-compatible"); } >From 0c873722684c8ee5c22cde442bcfaffd3598e24f Mon Sep 17 00:00:00 2001 From: Vladimir Vereschaka <[email protected]> Date: Tue, 19 May 2026 12:32:23 -0700 Subject: [PATCH 05/14] Added `-init-datetime-macros=` cc1 option. Updated ReleaseNotes.rst. Updated other options accordingly. --- clang/docs/ReleaseNotes.rst | 15 +++ clang/include/clang/Lex/PreprocessorOptions.h | 16 +++ clang/include/clang/Options/Options.td | 5 + clang/lib/Driver/ToolChains/Clang.cpp | 39 ++----- clang/lib/Lex/PPMacroExpansion.cpp | 102 ++++++++++++------ clang/test/Driver/cl-deterministic.c | 5 +- .../test/Preprocessor/init-datetime-macros.c | 60 +++++++++++ 7 files changed, 178 insertions(+), 64 deletions(-) create mode 100644 clang/test/Preprocessor/init-datetime-macros.c diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 5e7a0c76d4594..d599aaa9626d0 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -393,6 +393,17 @@ New Compiler Flags a hostname when generates the hashes. Known issues -- does not remap the source file pathes within PCH/PCM files. +- New ``-cl`` option ``/experimental:deterministic`` added to match CL's option. + This enables warning emission on usage of non-deterministic macros __DATE__, + __TIME__ and __TIMESTAMP__ and provides reproducable COFF's timestamp for + the output object files. + +- New ``-cl`` option ``/d1nodatetime`` added to match CL's option. This option + undefines the standard macros __DATE__, __TIME__ and __TIMESTAMP__ to allow + reproducable builds. These macros can be redefined from the command line if + necessary. ``/d1nodatetime-`` can be used to turn this feature off if + necessary to override the common build settings. + Deprecated Compiler Flags ------------------------- @@ -407,6 +418,10 @@ Modified Compiler Flags normalized in favor of the target system (same as the preprocessor does for the file macros) and allows the reproducable IDs on any build system. +- The ``-cl`` ``/Brepro`` option was modified to match the original CL's option + and now defines the standard macros __DATE__, __TIME__ and __TIMESTAMP__ to + "1". The previous functionality remains unchanged. + Removed Compiler Flags ---------------------- diff --git a/clang/include/clang/Lex/PreprocessorOptions.h b/clang/include/clang/Lex/PreprocessorOptions.h index db80eecce4908..4d1a30712836f 100644 --- a/clang/include/clang/Lex/PreprocessorOptions.h +++ b/clang/include/clang/Lex/PreprocessorOptions.h @@ -43,6 +43,18 @@ enum ObjCXXARCStandardLibraryKind { ARCXX_libstdcxx }; +/// How to initialize the date/time macros. +enum DateTimeInitKind { + /// Set to the current date and time. + Default = 0, + + /// Set to literal string "1". + LiteralOne = 1, + + /// Keep undefined. + Undefined = 2 +}; + /// Whether to disable the normal validation performed on precompiled /// headers and module files when they are loaded. enum class DisableValidationForModuleKind { @@ -209,6 +221,10 @@ class PreprocessorOptions { /// -cc1 flag for testing purposes. uint32_t InitialCounterValue = 0; + /// Specify initialization kind for __DATE__, __TIME__ and __TIMESTAMP__ + /// macros. + DateTimeInitKind InitDateTimeMacros = DateTimeInitKind::Default; + public: PreprocessorOptions() : PrecompiledPreambleBytes(0, false) {} diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td index 912b3bc610f6a..e3bddc0d51ac0 100644 --- a/clang/include/clang/Options/Options.td +++ b/clang/include/clang/Options/Options.td @@ -8896,6 +8896,11 @@ def fno_modules_check_relocated Group<f_Group>, HelpText<"Skip checks for relocated modules when loading PCM files">, MarshallingInfoNegativeFlag<PreprocessorOpts<"ModulesCheckRelocated">>; +def init_datetime_macros_EQ : Joined<["-"], "init-datetime-macros=">, + HelpText<"Change __DATE__, __TIME__, and __TIMESTAMP__ macros initialization and expansion">, + Values<"default,literalone,undefined">, + NormalizedValues<["Default", "LiteralOne", "Undefined"]>, + MarshallingInfoEnum<PreprocessorOpts<"InitDateTimeMacros">, "Default">; } // let Visibility = [CC1Option] diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 04b8cbebd8993..4ffb0acca56fb 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -8897,39 +8897,23 @@ void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType, Twine("-loader-replaceable-function=") + FuncOverride)); } - auto findMacro = [&](const std::string &Macro, bool claim = false) { - for (const auto *A : Args.filtered(options::OPT_D, options::OPT_U)) { - const std::string v(A->getValue()); - if (v == Macro || v.find(Macro + '=') != std::string::npos) - if (claim) - A->claim(); - return true; - } - return false; - }; - if (Args.hasArg(options::OPT__SLASH_experimental_deterministic)) { CmdArgs.push_back("-Wdate-time"); if (Args.hasArg(options::OPT_mincremental_linker_compatible)) { - D.Diag(diag::err_drv_argument_not_allowed_with) << "/experimental:deterministic" - << "/Brepro-"; + D.Diag(diag::err_drv_argument_not_allowed_with) + << "/experimental:deterministic" + << "/Brepro-"; } - // CL's sets COFF's OBJ timestamp to a hash of the source file path to get deterministic - // result, but we force this timestamp to 0, which also produces deterministic result. + // CL's sets COFF's OBJ timestamp to a hash of the source file path to get + // deterministic result, but we force this timestamp to 0, which also + // produces deterministic result. CmdArgs.push_back("-mno-incremental-linker-compatible"); } if (Args.hasFlag(options::OPT__SLASH_d1nodatetime, options::OPT__SLASH_d1nodatetime_, false)) { - // Allow user definitions for these macros from the command line. - CmdArgs.push_back("-Wno-builtin-macro-redefined"); - if (!findMacro("__DATE__")) - CmdArgs.push_back("-U__DATE__"); - if (!findMacro("__TIME__")) - CmdArgs.push_back("-U__TIME__"); - if (!findMacro("__TIMESTAMP__")) - CmdArgs.push_back("-U__TIMESTAMP__"); + CmdArgs.push_back("-init-datetime-macros=undefined"); } // /Brepro is an alias for -mincremental-linker-compatible option. @@ -8940,14 +8924,7 @@ void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType, // This options does not allow the user redifinitions for these macros. if (!Args.hasFlag(options::OPT__SLASH_d1nodatetime, options::OPT__SLASH_d1nodatetime_, false)) { - findMacro("__DATE__", true); - findMacro("__TIME__", true); - findMacro("__TIMESTAMP__", true); - - CmdArgs.push_back("-Wno-builtin-macro-redefined"); - CmdArgs.push_back("-D__DATE__=\"1\""); - CmdArgs.push_back("-D__TIME__=\"1\""); - CmdArgs.push_back("-D__TIMESTAMP__=\"1\""); + CmdArgs.push_back("-init-datetime-macros=literalone"); } } } diff --git a/clang/lib/Lex/PPMacroExpansion.cpp b/clang/lib/Lex/PPMacroExpansion.cpp index 5fd3512d2f45c..23a21f42b8e3a 100644 --- a/clang/lib/Lex/PPMacroExpansion.cpp +++ b/clang/lib/Lex/PPMacroExpansion.cpp @@ -324,8 +324,15 @@ void Preprocessor::dumpMacroInfo(const IdentifierInfo *II) { void Preprocessor::RegisterBuiltinMacros() { Ident__LINE__ = RegisterBuiltinMacro("__LINE__"); Ident__FILE__ = RegisterBuiltinMacro("__FILE__"); - Ident__DATE__ = RegisterBuiltinMacro("__DATE__"); - Ident__TIME__ = RegisterBuiltinMacro("__TIME__"); + // Keep __DATE__, __TIME__ and __TIMESTAMP__ undefined if it was requested. + // Those macros still be able defined from the command line. + if (getPreprocessorOpts().InitDateTimeMacros != DateTimeInitKind::Undefined) { + Ident__DATE__ = RegisterBuiltinMacro("__DATE__"); + Ident__TIME__ = RegisterBuiltinMacro("__TIME__"); + } else { + Ident__DATE__ = nullptr; + Ident__TIME__ = nullptr; + } Ident__COUNTER__ = RegisterBuiltinMacro("__COUNTER__"); Ident_Pragma = RegisterBuiltinMacro("_Pragma"); Ident__FLT_EVAL_METHOD__ = RegisterBuiltinMacro("__FLT_EVAL_METHOD__"); @@ -339,7 +346,10 @@ void Preprocessor::RegisterBuiltinMacros() { // GCC Extensions. Ident__BASE_FILE__ = RegisterBuiltinMacro("__BASE_FILE__"); Ident__INCLUDE_LEVEL__ = RegisterBuiltinMacro("__INCLUDE_LEVEL__"); - Ident__TIMESTAMP__ = RegisterBuiltinMacro("__TIMESTAMP__"); + if (getPreprocessorOpts().InitDateTimeMacros != DateTimeInitKind::Undefined) + Ident__TIMESTAMP__ = RegisterBuiltinMacro("__TIMESTAMP__"); + else + Ident__TIMESTAMP__ = nullptr; // Microsoft Extensions. if (getLangOpts().MicrosoftExt) { @@ -1040,8 +1050,32 @@ void Preprocessor::removeCachedMacroExpandedTokensOfLastLexer() { /// ComputeDATE_TIME - Compute the current time, enter it into the specified /// scratch buffer, then return DATELoc/TIMELoc locations with the position of /// the identifier tokens inserted. -static void ComputeDATE_TIME(SourceLocation &DATELoc, SourceLocation &TIMELoc, +static void ComputeDATE_TIME(SourceLocation &DATELoc, size_t &DATETokLen, + SourceLocation &TIMELoc, size_t &TIMETokLen, Preprocessor &PP) { + + if (PP.getPreprocessorOpts().InitDateTimeMacros == + DateTimeInitKind::LiteralOne) { + if (!DATELoc.isValid()) { + Token TmpTok; + TmpTok.startToken(); + PP.CreateString("\"1\"", TmpTok); + DATELoc = TmpTok.getLocation(); + } + // Always set up and return a token length for both - DATE and TIME. + DATETokLen = strlen("\"1\""); + + if (!TIMELoc.isValid()) { + Token TmpTok; + TmpTok.startToken(); + PP.CreateString("\"1\"", TmpTok); + TIMELoc = TmpTok.getLocation(); + } + TIMETokLen = strlen("\"1\""); + + return; + } + time_t TT; std::tm *TM; if (PP.getPreprocessorOpts().SourceDateEpoch) { @@ -1056,7 +1090,7 @@ static void ComputeDATE_TIME(SourceLocation &DATELoc, SourceLocation &TIMELoc, "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" }; - { + if (!DATELoc.isValid()) { SmallString<32> TmpBuffer; llvm::raw_svector_ostream TmpStream(TmpBuffer); if (TM) @@ -1069,8 +1103,9 @@ static void ComputeDATE_TIME(SourceLocation &DATELoc, SourceLocation &TIMELoc, PP.CreateString(TmpStream.str(), TmpTok); DATELoc = TmpTok.getLocation(); } + DATETokLen = strlen("\"Mmm dd yyyy\""); - { + if (!TIMELoc.isValid()) { SmallString<32> TmpBuffer; llvm::raw_svector_ostream TmpStream(TmpBuffer); if (TM) @@ -1083,6 +1118,7 @@ static void ComputeDATE_TIME(SourceLocation &DATELoc, SourceLocation &TIMELoc, PP.CreateString(TmpStream.str(), TmpTok); TIMELoc = TmpTok.getLocation(); } + TIMETokLen = strlen("\"hh:mm:ss\""); } /// HasFeature - Return true if we recognize and implement the feature @@ -1659,20 +1695,22 @@ void Preprocessor::ExpandBuiltinMacro(Token &Tok) { Tok.setKind(tok::string_literal); } else if (II == Ident__DATE__) { Diag(Tok.getLocation(), diag::warn_pp_date_time); - if (!DATELoc.isValid()) - ComputeDATE_TIME(DATELoc, TIMELoc, *this); + + size_t TIMETokLen = 0, DATETokLen = 0; + ComputeDATE_TIME(DATELoc, DATETokLen, TIMELoc, TIMETokLen, *this); Tok.setKind(tok::string_literal); - Tok.setLength(strlen("\"Mmm dd yyyy\"")); + Tok.setLength(DATETokLen); Tok.setLocation(SourceMgr.createExpansionLoc(DATELoc, Tok.getLocation(), Tok.getLocation(), Tok.getLength())); return; } else if (II == Ident__TIME__) { Diag(Tok.getLocation(), diag::warn_pp_date_time); - if (!TIMELoc.isValid()) - ComputeDATE_TIME(DATELoc, TIMELoc, *this); + + size_t TIMETokLen = 0, DATETokLen = 0; + ComputeDATE_TIME(DATELoc, DATETokLen, TIMELoc, TIMETokLen, *this); Tok.setKind(tok::string_literal); - Tok.setLength(strlen("\"hh:mm:ss\"")); + Tok.setLength(TIMETokLen); Tok.setLocation(SourceMgr.createExpansionLoc(TIMELoc, Tok.getLocation(), Tok.getLocation(), Tok.getLength())); @@ -1696,28 +1734,32 @@ void Preprocessor::ExpandBuiltinMacro(Token &Tok) { Diag(Tok.getLocation(), diag::warn_pp_date_time); // MSVC, ICC, GCC, VisualAge C++ extension. The generated string should be // of the form "Ddd Mmm dd hh::mm::ss yyyy", which is returned by asctime. - std::string Result; + std::string Result = "1"; // DateTimeInitKind::LiteralOne by default. std::stringstream TmpStream; - TmpStream.imbue(std::locale("C")); - if (getPreprocessorOpts().SourceDateEpoch) { - time_t TT = *getPreprocessorOpts().SourceDateEpoch; - std::tm *TM = std::gmtime(&TT); - TmpStream << std::put_time(TM, "%a %b %e %T %Y"); - } else { - // Get the file that we are lexing out of. If we're currently lexing from - // a macro, dig into the include stack. - const FileEntry *CurFile = nullptr; - if (PreprocessorLexer *TheLexer = getCurrentFileLexer()) - CurFile = SourceMgr.getFileEntryForID(TheLexer->getFileID()); - if (CurFile) { - time_t TT = CurFile->getModificationTime(); - struct tm *TM = localtime(&TT); + + // Requested regular __TIMESTAMP__ initialization. + if (getPreprocessorOpts().InitDateTimeMacros == DateTimeInitKind::Default) { + TmpStream.imbue(std::locale("C")); + if (getPreprocessorOpts().SourceDateEpoch) { + time_t TT = *getPreprocessorOpts().SourceDateEpoch; + std::tm *TM = std::gmtime(&TT); TmpStream << std::put_time(TM, "%a %b %e %T %Y"); + } else { + // Get the file that we are lexing out of. If we're currently lexing + // from a macro, dig into the include stack. + const FileEntry *CurFile = nullptr; + if (PreprocessorLexer *TheLexer = getCurrentFileLexer()) + CurFile = SourceMgr.getFileEntryForID(TheLexer->getFileID()); + if (CurFile) { + time_t TT = CurFile->getModificationTime(); + struct tm *TM = localtime(&TT); + TmpStream << std::put_time(TM, "%a %b %e %T %Y"); + } } + Result = TmpStream.str(); + if (Result.empty()) + Result = "??? ??? ?? ??:??:?? ????"; } - Result = TmpStream.str(); - if (Result.empty()) - Result = "??? ??? ?? ??:??:?? ????"; OS << '"' << Result << '"'; Tok.setKind(tok::string_literal); } else if (II == Ident__FLT_EVAL_METHOD__) { diff --git a/clang/test/Driver/cl-deterministic.c b/clang/test/Driver/cl-deterministic.c index 2c3df5f37d014..50ef612594f3e 100644 --- a/clang/test/Driver/cl-deterministic.c +++ b/clang/test/Driver/cl-deterministic.c @@ -1,8 +1,6 @@ // We have to run the compilation step to see the output, so we must be able to // target Windows. -// REQUIRES: system-windows - // RUN: %clang_cl -fno-integrated-cc1 -E /experimental:deterministic /d1nodatetime %s // RUN: %clang_cl -fno-integrated-cc1 -E /D IS_SYSHEADER=1 /experimental:deterministic /d1nodatetime %s @@ -13,8 +11,9 @@ // RUN: %clang_cl -E -### /experimental:deterministic %s 2>&1 | FileCheck %s --check-prefix=WDATETIME // WDATETIME: -Wdate-time +// WDATETIME: -mno-incremental-linker-compatible // RUN: %clang_cl -E -### /d1nodatetime %s 2>&1 | FileCheck %s --check-prefix=MACROREDEF -// MACROREDEF: -Wno-builtin-macro-redefined +// MACROREDEF: -init-datetime-macros=undefined #ifdef IS_HEADER diff --git a/clang/test/Preprocessor/init-datetime-macros.c b/clang/test/Preprocessor/init-datetime-macros.c new file mode 100644 index 0000000000000..f12de677e2bc9 --- /dev/null +++ b/clang/test/Preprocessor/init-datetime-macros.c @@ -0,0 +1,60 @@ +// RUN: %clang_cc1 -E -DDATETIME_DEFAULT -init-datetime-macros=default %s | FileCheck %s --check-prefix CHECK-INIT-DATETIME-DEFAULT +// RUN: %clang_cc1 -E -DDATETIME_DEFAULT %s | FileCheck %s --check-prefix CHECK-INIT-DATETIME-DEFAULT +// CHECK-INIT-DATETIME-DEFAULT: date: "{{(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)}} {{.*}}" +// CHECK-INIT-DATETIME-DEFAULT: time: "{{[0-9][0-9]:[0-9][0-9]:[0-9][0-9]}}" +// CHECK-INIT-DATETIME-DEFAULT: timestamp: "{{.*}} {{[0-9][0-9]:[0-9][0-9]:[0-9][0-9]}} {{.*}}" +// CHECK-INIT-DATETIME-DEFAULT-NOT: date: +// CHECK-INIT-DATETIME-DEFAULT-NOT: time: +// CHECK-INIT-DATETIME-DEFAULT-NOT: timestamp: + +// RUN: %clang_cc1 -E -DDATETIME_LITERALONE -init-datetime-macros=literalone %s | FileCheck %s --check-prefix CHECK-INIT-DATETIME-LITERALONE +// CHECK-INIT-DATETIME-LITERALONE: date: "1" +// CHECK-INIT-DATETIME-LITERALONE: time: "1" +// CHECK-INIT-DATETIME-LITERALONE: timestamp: "1" +// CHECK-INIT-DATETIME-LITERALONE-NOT: date: +// CHECK-INIT-DATETIME-LITERALONE-NOT: time: +// CHECK-INIT-DATETIME-LITERALONE-NOT: timestamp: + +// RUN: %clang_cc1 -E -DDATETIME_CUSTOM -init-datetime-macros=undefined -D__DATE__="\"d3\"" -D__TIME__="\"t4\"" -D__TIMESTAMP__="\"ts5\"" %s | FileCheck %s --check-prefix CHECK-INIT-DATETIME-CUSTOM +// CHECK-INIT-DATETIME-CUSTOM: date: "d3" +// CHECK-INIT-DATETIME-CUSTOM: time: "t4" +// CHECK-INIT-DATETIME-CUSTOM: timestamp: "ts5" + +// RUN: %clang_cc1 -DDATETIME_UNDEFINED -verify -Wall -init-datetime-macros=undefined %s + +// clang-cl deterministic options checks: +// /d1nodatetime - undefines __DATE__, __TIME__ and __TIMESTAMP__ +// /Brepro - sets __DATE__, __TIME__ and __TIMESTAMP__ to "1" + +// RUN: %clang_cl -Xclang -verify /d1nodatetime /DDATETIME_UNDEFINED /c %s + +// RUN: %clang_cl -E /Brepro /DDATETIME_LITERALONE /c %s | FileCheck %s --check-prefix CHECK-INIT-DATETIME-LITERALONE + +#if defined(DATETIME_LITERALONE) || defined(DATETIME_DEFAULT) || defined(DATETIME_CUSTOM) +date: __DATE__ +time: __TIME__ +timestamp: __TIMESTAMP__ +#endif + +// Check we didn't break literal processing inside of PP macro expansion. +#if defined(DATETIME_DEFAULT) +#define CUST_DATE __DATE__ +#define CUST_TIME __TIME__ +#define CUST_TIMESTAMP __TIMESTAMP__ +const char *s0 = "CD: " CUST_DATE " CT: " CUST_TIME " CTS: " CUST_TIMESTAMP +// CHECK-INIT-DATETIME-DEFAULT: const char *s0 = "CD: " "{{(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)}} {{.*}}" " CT: " "{{[0-9][0-9]:[0-9][0-9]:[0-9][0-9]}}" " CTS: " "{{.*}} {{[0-9][0-9]:[0-9][0-9]:[0-9][0-9]}} {{.*}}" +#endif + +#if defined(DATETIME_LITERALONE) +#define CUST_DATE __DATE__ +#define CUST_TIME __TIME__ +#define CUST_TIMESTAMP __TIMESTAMP__ +const char *s0 = "CD: " CUST_DATE " CT: " CUST_TIME " CTS: " CUST_TIMESTAMP +// CHECK-INIT-DATETIME-LITERALONE: const char *s0 = "CD: " "1" " CT: " "1" " CTS: " "1" +#endif + +#ifdef DATETIME_UNDEFINED +const char *s1 = __DATE__; // expected-error{{use of undeclared identifier '__DATE__'}} +const char *s2 = __TIME__; // expected-error{{use of undeclared identifier '__TIME__'}} +const char *s3 = __TIMESTAMP__; // expected-error{{use of undeclared identifier '__TIMESTAMP__'}} +#endif >From 8baa3bcf6899bfe327a4ef1a90834c5ad8373c42 Mon Sep 17 00:00:00 2001 From: Vladimir Vereschaka <[email protected]> Date: Tue, 19 May 2026 14:39:13 -0700 Subject: [PATCH 06/14] Updated formatting to pass the pre-commit tests. --- clang/lib/Driver/ToolChains/Clang.cpp | 6 ++++-- clang/test/Driver/cl-deterministic.c | 3 --- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 4ffb0acca56fb..8f28b46ea38a3 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -8912,14 +8912,16 @@ void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType, } if (Args.hasFlag(options::OPT__SLASH_d1nodatetime, - options::OPT__SLASH_d1nodatetime_, false)) { + options::OPT__SLASH_d1nodatetime_, false)) { CmdArgs.push_back("-init-datetime-macros=undefined"); } // /Brepro is an alias for -mincremental-linker-compatible option. if (!Args.hasFlag(options::OPT_mincremental_linker_compatible, options::OPT_mno_incremental_linker_compatible, - getToolChain().getTriple().isDefaultIncrementalLinkerCompatibleByDefault())) { + getToolChain() + .getTriple() + .isDefaultIncrementalLinkerCompatibleByDefault())) { // Redefine the date/time macros only if /d1nodatetime wasn't specified. // This options does not allow the user redifinitions for these macros. if (!Args.hasFlag(options::OPT__SLASH_d1nodatetime, diff --git a/clang/test/Driver/cl-deterministic.c b/clang/test/Driver/cl-deterministic.c index 50ef612594f3e..2566641f2ceaa 100644 --- a/clang/test/Driver/cl-deterministic.c +++ b/clang/test/Driver/cl-deterministic.c @@ -1,6 +1,3 @@ -// We have to run the compilation step to see the output, so we must be able to -// target Windows. - // RUN: %clang_cl -fno-integrated-cc1 -E /experimental:deterministic /d1nodatetime %s // RUN: %clang_cl -fno-integrated-cc1 -E /D IS_SYSHEADER=1 /experimental:deterministic /d1nodatetime %s >From 869243de803728b1a845e03ac3f23c1b75a51fe9 Mon Sep 17 00:00:00 2001 From: Vladimir Vereschaka <[email protected]> Date: Tue, 19 May 2026 23:10:03 -0700 Subject: [PATCH 07/14] Add one more test case for -init-datetime-macros=literalone. Redefine macros from the command line. --- clang/test/Preprocessor/init-datetime-macros.c | 1 + 1 file changed, 1 insertion(+) diff --git a/clang/test/Preprocessor/init-datetime-macros.c b/clang/test/Preprocessor/init-datetime-macros.c index f12de677e2bc9..19890102f6324 100644 --- a/clang/test/Preprocessor/init-datetime-macros.c +++ b/clang/test/Preprocessor/init-datetime-macros.c @@ -15,6 +15,7 @@ // CHECK-INIT-DATETIME-LITERALONE-NOT: time: // CHECK-INIT-DATETIME-LITERALONE-NOT: timestamp: +// RUN: %clang_cc1 -E -DDATETIME_CUSTOM -init-datetime-macros=literalone -D__DATE__="\"d3\"" -D__TIME__="\"t4\"" -D__TIMESTAMP__="\"ts5\"" %s | FileCheck %s --check-prefix CHECK-INIT-DATETIME-CUSTOM // RUN: %clang_cc1 -E -DDATETIME_CUSTOM -init-datetime-macros=undefined -D__DATE__="\"d3\"" -D__TIME__="\"t4\"" -D__TIMESTAMP__="\"ts5\"" %s | FileCheck %s --check-prefix CHECK-INIT-DATETIME-CUSTOM // CHECK-INIT-DATETIME-CUSTOM: date: "d3" // CHECK-INIT-DATETIME-CUSTOM: time: "t4" >From 8707915fdf1ba24798f46d2c3f7199d7c3d7758d Mon Sep 17 00:00:00 2001 From: Vladimir Vereschaka <[email protected]> Date: Tue, 19 May 2026 23:13:17 -0700 Subject: [PATCH 08/14] Add newline at end of file --- clang/test/Driver/cl-deterministic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/test/Driver/cl-deterministic.c b/clang/test/Driver/cl-deterministic.c index 2566641f2ceaa..8ba8e9a17895b 100644 --- a/clang/test/Driver/cl-deterministic.c +++ b/clang/test/Driver/cl-deterministic.c @@ -29,4 +29,4 @@ __TIME__ #define IS_HEADER #include __FILE__ -#endif \ No newline at end of file +#endif >From 38f4eddd1166e6228ffb3fa75d009ae1892e2436 Mon Sep 17 00:00:00 2001 From: Vladimir Vereschaka <[email protected]> Date: Wed, 10 Jun 2026 15:20:07 -0700 Subject: [PATCH 09/14] Update options::OPT__SLASH_d1nodatetime check. --- clang/lib/Driver/ToolChains/Clang.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 8f28b46ea38a3..21a50286e76bb 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -8911,10 +8911,11 @@ void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType, CmdArgs.push_back("-mno-incremental-linker-compatible"); } - if (Args.hasFlag(options::OPT__SLASH_d1nodatetime, - options::OPT__SLASH_d1nodatetime_, false)) { + bool HasNoDateTime = Args.hasFlag(options::OPT__SLASH_d1nodatetime, + options::OPT__SLASH_d1nodatetime_, false); + + if (HasNoDateTime) CmdArgs.push_back("-init-datetime-macros=undefined"); - } // /Brepro is an alias for -mincremental-linker-compatible option. if (!Args.hasFlag(options::OPT_mincremental_linker_compatible, @@ -8924,10 +8925,8 @@ void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType, .isDefaultIncrementalLinkerCompatibleByDefault())) { // Redefine the date/time macros only if /d1nodatetime wasn't specified. // This options does not allow the user redifinitions for these macros. - if (!Args.hasFlag(options::OPT__SLASH_d1nodatetime, - options::OPT__SLASH_d1nodatetime_, false)) { + if (!HasNoDateTime) CmdArgs.push_back("-init-datetime-macros=literalone"); - } } } >From 586b1add09add1473fb1fd2cca70421d9013399a Mon Sep 17 00:00:00 2001 From: Vladimir Vereschaka <[email protected]> Date: Wed, 10 Jun 2026 16:41:25 -0700 Subject: [PATCH 10/14] Update `init-datetime-macros` test to run correctly on Darwin. --- clang/test/Preprocessor/init-datetime-macros.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/test/Preprocessor/init-datetime-macros.c b/clang/test/Preprocessor/init-datetime-macros.c index 19890102f6324..2a300bf80a648 100644 --- a/clang/test/Preprocessor/init-datetime-macros.c +++ b/clang/test/Preprocessor/init-datetime-macros.c @@ -27,9 +27,9 @@ // /d1nodatetime - undefines __DATE__, __TIME__ and __TIMESTAMP__ // /Brepro - sets __DATE__, __TIME__ and __TIMESTAMP__ to "1" -// RUN: %clang_cl -Xclang -verify /d1nodatetime /DDATETIME_UNDEFINED /c %s +// RUN: %clang_cl -Xclang -verify /d1nodatetime /DDATETIME_UNDEFINED /c -- %s -// RUN: %clang_cl -E /Brepro /DDATETIME_LITERALONE /c %s | FileCheck %s --check-prefix CHECK-INIT-DATETIME-LITERALONE +// RUN: %clang_cl -E /Brepro /DDATETIME_LITERALONE /c -- %s | FileCheck %s --check-prefix CHECK-INIT-DATETIME-LITERALONE #if defined(DATETIME_LITERALONE) || defined(DATETIME_DEFAULT) || defined(DATETIME_CUSTOM) date: __DATE__ >From a48b0fa2229ab5256fd231c9b6b2a9e906dfa894 Mon Sep 17 00:00:00 2001 From: Vladimir Vereschaka <[email protected]> Date: Wed, 10 Jun 2026 17:02:05 -0700 Subject: [PATCH 11/14] Update `cl-deterministic` test to run correctly on Darwin. --- clang/test/Driver/cl-deterministic.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/clang/test/Driver/cl-deterministic.c b/clang/test/Driver/cl-deterministic.c index 8ba8e9a17895b..3f6737b25ec08 100644 --- a/clang/test/Driver/cl-deterministic.c +++ b/clang/test/Driver/cl-deterministic.c @@ -1,15 +1,15 @@ -// RUN: %clang_cl -fno-integrated-cc1 -E /experimental:deterministic /d1nodatetime %s -// RUN: %clang_cl -fno-integrated-cc1 -E /D IS_SYSHEADER=1 /experimental:deterministic /d1nodatetime %s +// RUN: %clang_cl -fno-integrated-cc1 -E /experimental:deterministic /d1nodatetime -- %s +// RUN: %clang_cl -fno-integrated-cc1 -E /D IS_SYSHEADER=1 /experimental:deterministic /d1nodatetime -- %s -// RUN: %clang_cl -E /experimental:deterministic /d1nodatetime %s -// RUN: %clang_cl -E /D IS_SYSHEADER=1 /experimental:deterministic /d1nodatetime %s +// RUN: %clang_cl -E /experimental:deterministic /d1nodatetime -- %s +// RUN: %clang_cl -E /D IS_SYSHEADER=1 /experimental:deterministic /d1nodatetime -- %s // not %clang_cc1 -Werror=date-time -Wno-builtin-macro-redefined %s -DIS_SYSHEADER -E 2>&1 | grep 'error: expansion' | count 3 -// RUN: %clang_cl -E -### /experimental:deterministic %s 2>&1 | FileCheck %s --check-prefix=WDATETIME +// RUN: %clang_cl -E -### /experimental:deterministic -- %s 2>&1 | FileCheck %s --check-prefix=WDATETIME // WDATETIME: -Wdate-time // WDATETIME: -mno-incremental-linker-compatible -// RUN: %clang_cl -E -### /d1nodatetime %s 2>&1 | FileCheck %s --check-prefix=MACROREDEF +// RUN: %clang_cl -E -### /d1nodatetime -- %s 2>&1 | FileCheck %s --check-prefix=MACROREDEF // MACROREDEF: -init-datetime-macros=undefined #ifdef IS_HEADER >From ebf06be52bac66be076b8669354cabc3b752c48b Mon Sep 17 00:00:00 2001 From: Vladimir Vereschaka <[email protected]> Date: Tue, 16 Jun 2026 18:54:32 -0700 Subject: [PATCH 12/14] Clean up and update `cl-deterministic.c` test. --- clang/test/Driver/cl-deterministic.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/clang/test/Driver/cl-deterministic.c b/clang/test/Driver/cl-deterministic.c index 3f6737b25ec08..34010f24e53c2 100644 --- a/clang/test/Driver/cl-deterministic.c +++ b/clang/test/Driver/cl-deterministic.c @@ -4,7 +4,7 @@ // RUN: %clang_cl -E /experimental:deterministic /d1nodatetime -- %s // RUN: %clang_cl -E /D IS_SYSHEADER=1 /experimental:deterministic /d1nodatetime -- %s -// not %clang_cc1 -Werror=date-time -Wno-builtin-macro-redefined %s -DIS_SYSHEADER -E 2>&1 | grep 'error: expansion' | count 3 +// expected-no-diagnostics // RUN: %clang_cl -E -### /experimental:deterministic -- %s 2>&1 | FileCheck %s --check-prefix=WDATETIME // WDATETIME: -Wdate-time @@ -18,9 +18,9 @@ #pragma clang system_header #endif -__TIME__ // expected-warning {{expansion of date or time macro is not reproducible}} -__DATE__ // expected-warning {{expansion of date or time macro is not reproducible}} -__TIMESTAMP__ // expected-warning {{expansion of date or time macro is not reproducible}} +__TIME__ +__DATE__ +__TIMESTAMP__ #define __TIME__ __TIME__ >From 63ee96713612d0c04e84178a5e261cdfea0b9e68 Mon Sep 17 00:00:00 2001 From: Vladimir Vereschaka <[email protected]> Date: Tue, 16 Jun 2026 18:58:14 -0700 Subject: [PATCH 13/14] Additional `init-datetime-macros-warns/nowarns` tests to check ghe diagnostic messages. --- clang/test/Preprocessor/init-datetime-macros-nowarns.c | 6 ++++++ clang/test/Preprocessor/init-datetime-macros-warns.c | 8 ++++++++ clang/test/Preprocessor/init-datetime-macros.c | 4 ++-- 3 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 clang/test/Preprocessor/init-datetime-macros-nowarns.c create mode 100644 clang/test/Preprocessor/init-datetime-macros-warns.c diff --git a/clang/test/Preprocessor/init-datetime-macros-nowarns.c b/clang/test/Preprocessor/init-datetime-macros-nowarns.c new file mode 100644 index 0000000000000..dbdaf8da425d6 --- /dev/null +++ b/clang/test/Preprocessor/init-datetime-macros-nowarns.c @@ -0,0 +1,6 @@ +// RUN: %clang_cc1 -E -DDATETIME_CUSTOM -init-datetime-macros=undefined -D__DATE__="\"d3\"" -D__TIME__="\"t4\"" -D__TIMESTAMP__="\"ts5\"" -verify %s +// expected-no-diagnostics + +date: __DATE__ +time: __TIME__ +timestamp: __TIMESTAMP__ diff --git a/clang/test/Preprocessor/init-datetime-macros-warns.c b/clang/test/Preprocessor/init-datetime-macros-warns.c new file mode 100644 index 0000000000000..b1f4c0376452d --- /dev/null +++ b/clang/test/Preprocessor/init-datetime-macros-warns.c @@ -0,0 +1,8 @@ +// RUN: %clang_cc1 -E -DDATETIME_CUSTOM -init-datetime-macros=literalone -D__DATE__="\"d3\"" -D__TIME__="\"t4\"" -D__TIMESTAMP__="\"ts5\"" -verify %s +// expected-warning@2{{redefining builtin macro}} +// expected-warning@3{{redefining builtin macro}} +// expected-warning@4{{redefining builtin macro}} + +date: __DATE__ +time: __TIME__ +timestamp: __TIMESTAMP__ diff --git a/clang/test/Preprocessor/init-datetime-macros.c b/clang/test/Preprocessor/init-datetime-macros.c index 2a300bf80a648..239bafd2b241e 100644 --- a/clang/test/Preprocessor/init-datetime-macros.c +++ b/clang/test/Preprocessor/init-datetime-macros.c @@ -15,7 +15,7 @@ // CHECK-INIT-DATETIME-LITERALONE-NOT: time: // CHECK-INIT-DATETIME-LITERALONE-NOT: timestamp: -// RUN: %clang_cc1 -E -DDATETIME_CUSTOM -init-datetime-macros=literalone -D__DATE__="\"d3\"" -D__TIME__="\"t4\"" -D__TIMESTAMP__="\"ts5\"" %s | FileCheck %s --check-prefix CHECK-INIT-DATETIME-CUSTOM +// RUN: %clang_cc1 -E -DDATETIME_CUSTOM -init-datetime-macros=literalone -Wno-builtin-macro-redefined -D__DATE__="\"d3\"" -D__TIME__="\"t4\"" -D__TIMESTAMP__="\"ts5\"" %s | FileCheck %s --check-prefix CHECK-INIT-DATETIME-CUSTOM // RUN: %clang_cc1 -E -DDATETIME_CUSTOM -init-datetime-macros=undefined -D__DATE__="\"d3\"" -D__TIME__="\"t4\"" -D__TIMESTAMP__="\"ts5\"" %s | FileCheck %s --check-prefix CHECK-INIT-DATETIME-CUSTOM // CHECK-INIT-DATETIME-CUSTOM: date: "d3" // CHECK-INIT-DATETIME-CUSTOM: time: "t4" @@ -29,7 +29,7 @@ // RUN: %clang_cl -Xclang -verify /d1nodatetime /DDATETIME_UNDEFINED /c -- %s -// RUN: %clang_cl -E /Brepro /DDATETIME_LITERALONE /c -- %s | FileCheck %s --check-prefix CHECK-INIT-DATETIME-LITERALONE +// RUN: %clang_cl -E /Brepro /DDATETIME_LITERALONE -- %s | FileCheck %s --check-prefix CHECK-INIT-DATETIME-LITERALONE #if defined(DATETIME_LITERALONE) || defined(DATETIME_DEFAULT) || defined(DATETIME_CUSTOM) date: __DATE__ >From c9d2e84b63c188f11cc809b36f5ff45612f48a07 Mon Sep 17 00:00:00 2001 From: Vladimir Vereschaka <[email protected]> Date: Tue, 16 Jun 2026 19:02:14 -0700 Subject: [PATCH 14/14] Fixed typos --- clang/lib/Driver/ToolChains/Clang.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 21a50286e76bb..59e6c7dd8e79c 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -8924,7 +8924,7 @@ void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType, .getTriple() .isDefaultIncrementalLinkerCompatibleByDefault())) { // Redefine the date/time macros only if /d1nodatetime wasn't specified. - // This options does not allow the user redifinitions for these macros. + // This option does not allow the user redefinitions for these macros. if (!HasNoDateTime) CmdArgs.push_back("-init-datetime-macros=literalone"); } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
