]> granicus.if.org Git - clang/commitdiff
Show -Wdate-time in system headers
authorAlp Toker <alp@nuanti.com>
Tue, 10 Jun 2014 06:09:00 +0000 (06:09 +0000)
committerAlp Toker <alp@nuanti.com>
Tue, 10 Jun 2014 06:09:00 +0000 (06:09 +0000)
Anyone enabling this warning would expect to hear about all occurrences
including those in system headers that can cause non-reproducible builds.

To achieve this, rework ShowInSystemHeader to remove broken unused mapping code
that didn't make sense with a simpler and correct scheme.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@210512 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticIDs.h
include/clang/Basic/DiagnosticLexKinds.td
lib/Basic/DiagnosticIDs.cpp
test/Lexer/warn-date-time.c

index c952e49793b169c2738311d4eaa8ed5536b050b0..3627d1f9751bf56189d0d20a9e275d8a917528ac 100644 (file)
@@ -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; }
 
index 0ccc1de7478c30b621bc4a1526d7f8c6668d6889..88b4da5d37c7f8c5ae2c235ffa781d30cfcec38e 100644 (file)
@@ -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">;
index 47798596ccd2ae0fdbf1efd562401dd2f6c6b5fc..7c8fe365f5b7be4bde9c2641be59eea4f6313b69 100644 (file)
@@ -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;
index 38999333aeb79a3683a963b3dda2cfc29a6200ed..96fb55317ebc604823653fbefab0f599694f6073 100644 (file)
@@ -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