Author: Yi-Chi Lee Date: 2024-07-24T08:56:37+02:00 New Revision: fad17b43dbc09ac7e0a95535459845f72c2b739a
URL: https://github.com/llvm/llvm-project/commit/fad17b43dbc09ac7e0a95535459845f72c2b739a DIFF: https://github.com/llvm/llvm-project/commit/fad17b43dbc09ac7e0a95535459845f72c2b739a.diff LOG: [clang] replaced the usage of `asctime` with `std::put_time` (#99075) In `clang/lib/Lex/PPMacroExpansion.cpp`, replaced the usage of the obsolete `asctime` function with `std::put_time` for generating timestamp strings. Fixes: https://github.com/llvm/llvm-project/issues/98724 Added: Modified: clang/lib/Lex/PPMacroExpansion.cpp Removed: ################################################################################ diff --git a/clang/lib/Lex/PPMacroExpansion.cpp b/clang/lib/Lex/PPMacroExpansion.cpp index 3913ff08c2eb5..879f01e87806e 100644 --- a/clang/lib/Lex/PPMacroExpansion.cpp +++ b/clang/lib/Lex/PPMacroExpansion.cpp @@ -52,7 +52,9 @@ #include <cstddef> #include <cstring> #include <ctime> +#include <iomanip> #include <optional> +#include <sstream> #include <string> #include <tuple> #include <utility> @@ -1721,11 +1723,13 @@ 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. - const char *Result; + std::string Result; + std::stringstream TmpStream; + TmpStream.imbue(std::locale("C")); if (getPreprocessorOpts().SourceDateEpoch) { time_t TT = *getPreprocessorOpts().SourceDateEpoch; std::tm *TM = std::gmtime(&TT); - Result = asctime(TM); + 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. @@ -1735,13 +1739,13 @@ void Preprocessor::ExpandBuiltinMacro(Token &Tok) { if (CurFile) { time_t TT = CurFile->getModificationTime(); struct tm *TM = localtime(&TT); - Result = asctime(TM); - } else { - Result = "??? ??? ?? ??:??:?? ????\n"; + TmpStream << std::put_time(TM, "%a %b %e %T %Y"); } } - // Surround the string with " and strip the trailing newline. - OS << '"' << StringRef(Result).drop_back() << '"'; + Result = TmpStream.str(); + if (Result.empty()) + Result = "??? ??? ?? ??:??:?? ????"; + OS << '"' << Result << '"'; Tok.setKind(tok::string_literal); } else if (II == Ident__FLT_EVAL_METHOD__) { // __FLT_EVAL_METHOD__ is set to the default value. _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits