[cfe-commits] r140770 - in /cfe/trunk: include/clang/Basic/DiagnosticIDs.h lib/Basic/Diagnostic.cpp lib/Basic/DiagnosticIDs.cpp test/CXX/dcl.decl/dcl.init/dcl.init.aggr/p4.cpp test/Frontend/Weverything.c test/Frontend/warning-mapping-2.c test/Frontend/warning-mapping-4.c

Daniel Dunbar daniel at zuster.org
Wed Sep 28 18:58:05 PDT 2011


Author: ddunbar
Date: Wed Sep 28 20:58:05 2011
New Revision: 140770

URL: http://llvm.org/viewvc/llvm-project?rev=140770&view=rev
Log:
Basic/Diagnostics: Rewrite DiagnosticIDs::getDiagnosticLevel completely to be straighter line code, use the new DiagnosticMappingInfo flags, and eliminate the odd MAP_WARNING_NO_WERROR and friend mappings.
 - This fixes a host of obscure bugs with regards to how warning mapping options composed with one another, and I believe makes the code substantially easier to read and reason about.

Added:
    cfe/trunk/test/Frontend/warning-mapping-4.c
Modified:
    cfe/trunk/include/clang/Basic/DiagnosticIDs.h
    cfe/trunk/lib/Basic/Diagnostic.cpp
    cfe/trunk/lib/Basic/DiagnosticIDs.cpp
    cfe/trunk/test/CXX/dcl.decl/dcl.init/dcl.init.aggr/p4.cpp
    cfe/trunk/test/Frontend/Weverything.c
    cfe/trunk/test/Frontend/warning-mapping-2.c

Modified: cfe/trunk/include/clang/Basic/DiagnosticIDs.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticIDs.h?rev=140770&r1=140769&r2=140770&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticIDs.h (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticIDs.h Wed Sep 28 20:58:05 2011
@@ -65,17 +65,7 @@
       MAP_IGNORE  = 1,     //< Map this diagnostic to nothing, ignore it.
       MAP_WARNING = 2,     //< Map this diagnostic to a warning.
       MAP_ERROR   = 3,     //< Map this diagnostic to an error.
-      MAP_FATAL   = 4,     //< Map this diagnostic to a fatal error.
-
-      /// Map this diagnostic to "warning", but make it immune to -Werror.  This
-      /// happens when you specify -Wno-error=foo.
-      MAP_WARNING_NO_WERROR = 5,
-      /// Map this diagnostic to "warning", but make it immune to
-      /// -Wno-system-headers.
-      MAP_WARNING_SHOW_IN_SYSTEM_HEADER = 6,
-      /// Map this diagnostic to "error", but make it immune to -Wfatal-errors.
-      /// This happens for -Wno-fatal-errors=foo.
-      MAP_ERROR_NO_WFATAL = 7
+      MAP_FATAL   = 4      //< Map this diagnostic to a fatal error.
     };
   }
 

Modified: cfe/trunk/lib/Basic/Diagnostic.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Diagnostic.cpp?rev=140770&r1=140769&r2=140770&view=diff
==============================================================================
--- cfe/trunk/lib/Basic/Diagnostic.cpp (original)
+++ cfe/trunk/lib/Basic/Diagnostic.cpp Wed Sep 28 20:58:05 2011
@@ -257,7 +257,10 @@
     DiagnosticMappingInfo &Info = GetCurDiagState()->getOrAddMappingInfo(
       GroupDiags[i]);
 
-    Info.setMapping(diag::MAP_WARNING_NO_WERROR);
+    if (Info.getMapping() == diag::MAP_ERROR ||
+        Info.getMapping() == diag::MAP_FATAL)
+      Info.setMapping(diag::MAP_WARNING);
+
     Info.setNoWarningAsError(true);
   }
 
@@ -284,7 +287,9 @@
     DiagnosticMappingInfo &Info = GetCurDiagState()->getOrAddMappingInfo(
       GroupDiags[i]);
 
-    Info.setMapping(diag::MAP_ERROR_NO_WFATAL);
+    if (Info.getMapping() == diag::MAP_FATAL)
+      Info.setMapping(diag::MAP_ERROR);
+
     Info.setNoErrorAsFatal(true);
   }
 

Modified: cfe/trunk/lib/Basic/DiagnosticIDs.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/DiagnosticIDs.cpp?rev=140770&r1=140769&r2=140770&view=diff
==============================================================================
--- cfe/trunk/lib/Basic/DiagnosticIDs.cpp (original)
+++ cfe/trunk/lib/Basic/DiagnosticIDs.cpp Wed Sep 28 20:58:05 2011
@@ -194,14 +194,12 @@
     if (StaticInfo->WarnNoWerror) {
       assert(Info.getMapping() == diag::MAP_WARNING &&
              "Unexpected mapping with no-Werror bit!");
-      Info.setMapping(diag::MAP_WARNING_NO_WERROR);
       Info.setNoWarningAsError(true);
     }
 
     if (StaticInfo->WarnShowInSystemHeader) {
       assert(Info.getMapping() == diag::MAP_WARNING &&
              "Unexpected mapping with show-in-system-header bit!");
-      Info.setMapping(diag::MAP_WARNING_SHOW_IN_SYSTEM_HEADER);
       Info.setShowInSystemHeader(true);
     }
   }
@@ -533,89 +531,72 @@
   DiagnosticMappingInfo &MappingInfo = State->getOrAddMappingInfo(
     (diag::kind)DiagID);
 
-  bool ShouldEmitInSystemHeader = false;
-
   switch (MappingInfo.getMapping()) {
   default: llvm_unreachable("Unknown mapping!");
   case diag::MAP_IGNORE:
-    if (Diag.EnableAllWarnings) {
-      // Leave the warning disabled if it was explicitly ignored.
-      if (MappingInfo.isUser())
-        return DiagnosticIDs::Ignored;
-     
-      Result = Diag.WarningsAsErrors ? DiagnosticIDs::Error 
-                                     : DiagnosticIDs::Warning;
-    }
-    // Otherwise, ignore this diagnostic unless this is an extension diagnostic
-    // and we're mapping them onto warnings or errors.
-    else if (!isBuiltinExtensionDiag(DiagID) ||  // Not an extension
-             Diag.ExtBehavior == DiagnosticsEngine::Ext_Ignore || // Ext ignored
-             MappingInfo.isUser()) {           // User explicitly mapped it.
-      return DiagnosticIDs::Ignored;
-    }
-    else {
-      Result = DiagnosticIDs::Warning;
-    }
-
-    if (Diag.ExtBehavior == DiagnosticsEngine::Ext_Error)
-      Result = DiagnosticIDs::Error;
-    if (Result == DiagnosticIDs::Error && Diag.ErrorsAsFatal)
-      Result = DiagnosticIDs::Fatal;
+    Result = DiagnosticIDs::Ignored;
+    break;
+  case diag::MAP_WARNING:
+    Result = DiagnosticIDs::Warning;
     break;
   case diag::MAP_ERROR:
     Result = DiagnosticIDs::Error;
-    if (Diag.ErrorsAsFatal)
-      Result = DiagnosticIDs::Fatal;
     break;
   case diag::MAP_FATAL:
     Result = DiagnosticIDs::Fatal;
     break;
-  case diag::MAP_WARNING_SHOW_IN_SYSTEM_HEADER:
-    ShouldEmitInSystemHeader = true;
-    // continue as MAP_WARNING.
-  case diag::MAP_WARNING:
-    // If warnings are globally mapped to ignore or error, do it.
-    if (Diag.IgnoreAllWarnings)
-      return DiagnosticIDs::Ignored;
+  }
 
+  // Upgrade ignored diagnostics if -Weverything is enabled.
+  if (Diag.EnableAllWarnings && Result == DiagnosticIDs::Ignored &&
+      !MappingInfo.isUser())
     Result = DiagnosticIDs::Warning;
 
-    // If this is an extension diagnostic and we're in -pedantic-error mode, and
-    // if the user didn't explicitly map it, upgrade to an error.
-    if (Diag.ExtBehavior == DiagnosticsEngine::Ext_Error &&
-        !MappingInfo.isUser() &&
-        isBuiltinExtensionDiag(DiagID))
-      Result = DiagnosticIDs::Error;
-
-    if (Diag.WarningsAsErrors)
-      Result = DiagnosticIDs::Error;
-    if (Result == DiagnosticIDs::Error && Diag.ErrorsAsFatal)
-      Result = DiagnosticIDs::Fatal;
-    break;
-
-  case diag::MAP_WARNING_NO_WERROR:
-    // Diagnostics specified with -Wno-error=foo should be set to warnings, but
-    // not be adjusted by -Werror or -pedantic-errors.
-    Result = DiagnosticIDs::Warning;
+  // Ignore any kind of extension diagnostics inside __extension__ blocks.
+  bool IsExtensionDiag = isBuiltinExtensionDiag(DiagID);
+  if (Diag.AllExtensionsSilenced && IsExtensionDiag)
+    return DiagnosticIDs::Ignored;
 
-    // If warnings are globally mapped to ignore or error, do it.
-    if (Diag.IgnoreAllWarnings)
-      return DiagnosticIDs::Ignored;
+  // For extension diagnostics that haven't been explicitly mapped, check if we
+  // should upgrade the diagnostic.
+  if (IsExtensionDiag && !MappingInfo.isUser()) {
+    switch (Diag.ExtBehavior) {
+    case DiagnosticsEngine::Ext_Ignore:
+      break; 
+    case DiagnosticsEngine::Ext_Warn:
+      // Upgrade ignored diagnostics to warnings.
+      if (Result == DiagnosticIDs::Ignored)
+        Result = DiagnosticIDs::Warning;
+      break;
+    case DiagnosticsEngine::Ext_Error:
+      // Upgrade ignored or warning diagnostics to errors.
+      if (Result == DiagnosticIDs::Ignored || Result == DiagnosticIDs::Warning)
+        Result = DiagnosticIDs::Error;
+      break;
+    }
+  }
 
-    break;
+  // At this point, ignored errors can no longer be upgraded.
+  if (Result == DiagnosticIDs::Ignored)
+    return Result;
+
+  // Honor -w, which is lower in priority than pedantic-errors, but higher than
+  // -Werror.
+  if (Result == DiagnosticIDs::Warning && Diag.IgnoreAllWarnings)
+    return DiagnosticIDs::Ignored;
 
-  case diag::MAP_ERROR_NO_WFATAL:
-    // Diagnostics specified as -Wno-fatal-error=foo should be errors, but
-    // unaffected by -Wfatal-errors.
-    Result = DiagnosticIDs::Error;
-    break;
+  // If -Werror is enabled, map warnings to errors unless explicitly disabled.
+  if (Result == DiagnosticIDs::Warning) {
+    if (Diag.WarningsAsErrors && !MappingInfo.hasNoWarningAsError())
+      Result = DiagnosticIDs::Error;
   }
 
-  // Okay, we're about to return this as a "diagnostic to emit" one last check:
-  // if this is any sort of extension warning, and if we're in an __extension__
-  // block, silence it.
-  if (Diag.AllExtensionsSilenced && isBuiltinExtensionDiag(DiagID))
-    return DiagnosticIDs::Ignored;
+  // If -Wfatal-errors is enabled, map errors to fatal unless explicity
+  // disabled.
+  if (Result == DiagnosticIDs::Error) {
+    if (Diag.ErrorsAsFatal && !MappingInfo.hasNoErrorAsFatal())
+      Result = DiagnosticIDs::Fatal;
+  }
 
   // If we are in a system header, we ignore it.
   // We also want to ignore extensions and warnings in -Werror and
@@ -624,7 +605,7 @@
       DiagClass != CLASS_ERROR &&
       // Custom diagnostics always are emitted in system headers.
       DiagID < diag::DIAG_UPPER_LIMIT &&
-      !ShouldEmitInSystemHeader &&
+      !MappingInfo.hasShowInSystemHeader() &&
       Diag.SuppressSystemWarnings &&
       Loc.isValid() &&
       Diag.getSourceManager().isInSystemHeader(

Modified: cfe/trunk/test/CXX/dcl.decl/dcl.init/dcl.init.aggr/p4.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.decl/dcl.init/dcl.init.aggr/p4.cpp?rev=140770&r1=140769&r2=140770&view=diff
==============================================================================
--- cfe/trunk/test/CXX/dcl.decl/dcl.init/dcl.init.aggr/p4.cpp (original)
+++ cfe/trunk/test/CXX/dcl.decl/dcl.init/dcl.init.aggr/p4.cpp Wed Sep 28 20:58:05 2011
@@ -15,4 +15,4 @@
 }
 
 // Allowed by GNU extension
-int a4[] = {}; // expected-warning {{zero size arrays}}
+int a4[] = {}; // expected-error {{zero size arrays}}

Modified: cfe/trunk/test/Frontend/Weverything.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/Weverything.c?rev=140770&r1=140769&r2=140770&view=diff
==============================================================================
--- cfe/trunk/test/Frontend/Weverything.c (original)
+++ cfe/trunk/test/Frontend/Weverything.c Wed Sep 28 20:58:05 2011
@@ -2,9 +2,6 @@
 // become errors.
 //
 // RUN: %clang_cc1 -verify -Weverything -pedantic-errors %s
-//
-// FIXME: This is currently broken.
-// XFAIL: *
 
 int f0(int, unsigned);
 int f0(int x, unsigned y) {

Modified: cfe/trunk/test/Frontend/warning-mapping-2.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/warning-mapping-2.c?rev=140770&r1=140769&r2=140770&view=diff
==============================================================================
--- cfe/trunk/test/Frontend/warning-mapping-2.c (original)
+++ cfe/trunk/test/Frontend/warning-mapping-2.c Wed Sep 28 20:58:05 2011
@@ -1,8 +1,5 @@
 // Check that -w has lower priority than -pedantic-errors.
 // RUN: %clang_cc1 -verify -pedantic-errors -w %s
-//
-// FIXME: We currently get this wrong.
-// XFAIL: *
 
 void f0() { f1(); } // expected-error {{implicit declaration of function}}
 

Added: cfe/trunk/test/Frontend/warning-mapping-4.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/warning-mapping-4.c?rev=140770&view=auto
==============================================================================
--- cfe/trunk/test/Frontend/warning-mapping-4.c (added)
+++ cfe/trunk/test/Frontend/warning-mapping-4.c Wed Sep 28 20:58:05 2011
@@ -0,0 +1,6 @@
+// RUN: %clang_cc1 -verify -Wno-error=sign-compare %s
+// RUN: %clang_cc1 -verify -Wsign-compare -w -Wno-error=sign-compare %s
+
+int f0(int x, unsigned y) {
+  return x < y;
+}





More information about the cfe-commits mailing list