diff options
Diffstat (limited to 'clang/lib/Frontend/CompilerInvocation.cpp')
-rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 656e595..bcd5359 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -94,7 +94,9 @@ #include <cassert> #include <cstddef> #include <cstring> +#include <ctime> #include <fstream> +#include <limits> #include <memory> #include <string> #include <tuple> @@ -4307,6 +4309,21 @@ static bool ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args, Opts.addRemappedFile(Split.first, Split.second); } + if (const char *Epoch = std::getenv("SOURCE_DATE_EPOCH")) { + // SOURCE_DATE_EPOCH, if specified, must be a non-negative decimal integer. + // On time64 systems, pick 253402300799 (the UNIX timestamp of + // 9999-12-31T23:59:59Z) as the upper bound. + const uint64_t MaxTimestamp = + std::min<uint64_t>(std::numeric_limits<time_t>::max(), 253402300799); + uint64_t V; + if (StringRef(Epoch).getAsInteger(10, V) || V > MaxTimestamp) { + Diags.Report(diag::err_fe_invalid_source_date_epoch) + << Epoch << MaxTimestamp; + } else { + Opts.SourceDateEpoch = V; + } + } + // Always avoid lexing editor placeholders when we're just running the // preprocessor as we never want to emit the // "editor placeholder in source file" error in PP only mode. |