diff --git a/clang/include/clang/Basic/DiagnosticIDs.h b/clang/include/clang/Basic/DiagnosticIDs.h index c952e49793b1..3627d1f9751b 100644 --- a/clang/include/clang/Basic/DiagnosticIDs.h +++ b/clang/include/clang/Basic/DiagnosticIDs.h @@ -74,7 +74,6 @@ class DiagnosticMappingInfo { unsigned Mapping : 3; unsigned IsUser : 1; unsigned IsPragma : 1; - unsigned HasShowInSystemHeader : 1; unsigned HasNoWarningAsError : 1; unsigned HasNoErrorAsFatal : 1; @@ -85,7 +84,6 @@ public: Result.Mapping = Mapping; Result.IsUser = IsUser; Result.IsPragma = IsPragma; - Result.HasShowInSystemHeader = 0; Result.HasNoWarningAsError = 0; Result.HasNoErrorAsFatal = 0; return Result; @@ -97,9 +95,6 @@ public: bool isUser() const { return IsUser; } bool isPragma() const { return IsPragma; } - bool hasShowInSystemHeader() const { return HasShowInSystemHeader; } - void setShowInSystemHeader(bool Value) { HasShowInSystemHeader = Value; } - bool hasNoWarningAsError() const { return HasNoWarningAsError; } void setNoWarningAsError(bool Value) { HasNoWarningAsError = Value; } diff --git a/clang/include/clang/Basic/DiagnosticLexKinds.td b/clang/include/clang/Basic/DiagnosticLexKinds.td index 0ccc1de7478c..88b4da5d37c7 100644 --- a/clang/include/clang/Basic/DiagnosticLexKinds.td +++ b/clang/include/clang/Basic/DiagnosticLexKinds.td @@ -544,7 +544,7 @@ def err_pp_eof_in_arc_cf_code_audited : Error< def warn_pp_date_time : Warning< "expansion of date or time macro is not reproducible">, - DefaultIgnore, InGroup<DiagGroup<"date-time">>; + DefaultWarnShowInSystemHeader, DefaultIgnore, InGroup<DiagGroup<"date-time">>; // Module map parsing def err_mmap_unknown_token : Error<"skipping stray token">; diff --git a/clang/lib/Basic/DiagnosticIDs.cpp b/clang/lib/Basic/DiagnosticIDs.cpp index 47798596ccd2..7c8fe365f5b7 100644 --- a/clang/lib/Basic/DiagnosticIDs.cpp +++ b/clang/lib/Basic/DiagnosticIDs.cpp @@ -164,12 +164,6 @@ static DiagnosticMappingInfo GetDefaultDiagMappingInfo(unsigned DiagID) { "Unexpected mapping with no-Werror bit!"); Info.setNoWarningAsError(true); } - - if (StaticInfo->WarnShowInSystemHeader) { - assert(Info.getMapping() == diag::MAP_WARNING && - "Unexpected mapping with show-in-system-header bit!"); - Info.setShowInSystemHeader(true); - } } return Info; @@ -486,16 +480,15 @@ DiagnosticIDs::getDiagnosticLevel(unsigned DiagID, unsigned DiagClass, Result = DiagnosticIDs::Fatal; } + // Custom diagnostics always are emitted in system headers. + bool ShowInSystemHeader = + !GetDiagInfo(DiagID) || GetDiagInfo(DiagID)->WarnShowInSystemHeader; + // If we are in a system header, we ignore it. We look at the diagnostic class // because we also want to ignore extensions and warnings in -Werror and // -pedantic-errors modes, which *map* warnings/extensions to errors. - if (Result >= DiagnosticIDs::Warning && - DiagClass != CLASS_ERROR && - // Custom diagnostics always are emitted in system headers. - DiagID < diag::DIAG_UPPER_LIMIT && - !MappingInfo.hasShowInSystemHeader() && - Diag.SuppressSystemWarnings && - Loc.isValid() && + if (Result >= DiagnosticIDs::Warning && DiagClass != CLASS_ERROR && + !ShowInSystemHeader && Diag.SuppressSystemWarnings && Loc.isValid() && Diag.getSourceManager().isInSystemHeader( Diag.getSourceManager().getExpansionLoc(Loc))) return DiagnosticIDs::Ignored; diff --git a/clang/test/Lexer/warn-date-time.c b/clang/test/Lexer/warn-date-time.c index 38999333aeb7..96fb55317ebc 100644 --- a/clang/test/Lexer/warn-date-time.c +++ b/clang/test/Lexer/warn-date-time.c @@ -1,4 +1,13 @@ // RUN: %clang_cc1 -Wdate-time -Wno-builtin-macro-redefined %s -verify -E +// RUN: %clang_cc1 -Wdate-time -Wno-builtin-macro-redefined %s -DIS_SYSHEADER -verify -E +// RUN: not %clang_cc1 -Werror=date-time -Wno-builtin-macro-redefined %s -DIS_SYSHEADER -E 2>&1 | grep 'error: expansion' | count 3 + + +#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}} @@ -6,3 +15,9 @@ __TIMESTAMP__ // expected-warning {{expansion of date or time macro is not repro #define __TIME__ __TIME__ + +#else + +#define IS_HEADER +#include __FILE__ +#endif