From: Alp Toker Date: Tue, 10 Jun 2014 06:08:51 +0000 (+0000) Subject: Implement -Wdate-time preprocessor warning X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=51debf8bd31895e35af16d23d508ab1a410c0ca3;p=clang Implement -Wdate-time preprocessor warning This GCC warning is useful for validating reproducible builds and might help when tracking down issues with modules too. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@210511 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticLexKinds.td b/include/clang/Basic/DiagnosticLexKinds.td index a32b9025c1..0ccc1de747 100644 --- a/include/clang/Basic/DiagnosticLexKinds.td +++ b/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/lib/Lex/PPMacroExpansion.cpp b/lib/Lex/PPMacroExpansion.cpp index 57bc946804..b22d9d4590 100644 --- a/lib/Lex/PPMacroExpansion.cpp +++ b/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/test/Lexer/warn-date-time.c b/test/Lexer/warn-date-time.c new file mode 100644 index 0000000000..38999333ae --- /dev/null +++ b/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__