From 4f43e554081ecac149fe360bee6eef2ed7dab8ea Mon Sep 17 00:00:00 2001 From: Alp Toker Date: Tue, 10 Jun 2014 06:08:51 +0000 Subject: [PATCH] Implement -Wdate-time preprocessor warning This GCC warning is useful for validating reproducible builds and might help when tracking down issues with modules too. llvm-svn: 210511 --- clang/include/clang/Basic/DiagnosticLexKinds.td | 4 ++++ clang/lib/Lex/PPMacroExpansion.cpp | 5 ++++- clang/test/Lexer/warn-date-time.c | 8 ++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 clang/test/Lexer/warn-date-time.c diff --git a/clang/include/clang/Basic/DiagnosticLexKinds.td b/clang/include/clang/Basic/DiagnosticLexKinds.td index a32b902..0ccc1de 100644 --- a/clang/include/clang/Basic/DiagnosticLexKinds.td +++ b/clang/include/clang/Basic/DiagnosticLexKinds.td @@ -542,6 +542,10 @@ def err_pp_include_in_arc_cf_code_audited : Error< def err_pp_eof_in_arc_cf_code_audited : Error< "'#pragma clang arc_cf_code_audited' was not ended within this file">; +def warn_pp_date_time : Warning< + "expansion of date or time macro is not reproducible">, + DefaultIgnore, InGroup>; + // Module map parsing def err_mmap_unknown_token : Error<"skipping stray token">; def err_mmap_expected_module : Error<"expected module declaration">; diff --git a/clang/lib/Lex/PPMacroExpansion.cpp b/clang/lib/Lex/PPMacroExpansion.cpp index 57bc946..b22d9d4 100644 --- a/clang/lib/Lex/PPMacroExpansion.cpp +++ b/clang/lib/Lex/PPMacroExpansion.cpp @@ -1294,6 +1294,7 @@ 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); Tok.setKind(tok::string_literal); @@ -1303,6 +1304,7 @@ void Preprocessor::ExpandBuiltinMacro(Token &Tok) { Tok.getLength())); return; } else if (II == Ident__TIME__) { + Diag(Tok.getLocation(), diag::warn_pp_date_time); if (!TIMELoc.isValid()) ComputeDATE_TIME(DATELoc, TIMELoc, *this); Tok.setKind(tok::string_literal); @@ -1327,6 +1329,7 @@ void Preprocessor::ExpandBuiltinMacro(Token &Tok) { OS << Depth; Tok.setKind(tok::numeric_constant); } else if (II == Ident__TIMESTAMP__) { + 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. @@ -1347,7 +1350,7 @@ void Preprocessor::ExpandBuiltinMacro(Token &Tok) { Result = "??? ??? ?? ??:??:?? ????\n"; } // Surround the string with " and strip the trailing newline. - OS << '"' << StringRef(Result, strlen(Result)-1) << '"'; + OS << '"' << StringRef(Result).drop_back() << '"'; Tok.setKind(tok::string_literal); } else if (II == Ident__COUNTER__) { // __COUNTER__ expands to a simple numeric value. diff --git a/clang/test/Lexer/warn-date-time.c b/clang/test/Lexer/warn-date-time.c new file mode 100644 index 0000000..3899933 --- /dev/null +++ b/clang/test/Lexer/warn-date-time.c @@ -0,0 +1,8 @@ +// RUN: %clang_cc1 -Wdate-time -Wno-builtin-macro-redefined %s -verify -E + +__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__ -- 2.7.4