]> granicus.if.org Git - clang/commitdiff
Basic/Diagnostics: Add an isDefaultMappingAsError method, and switch TextDiagnosticPr...
authorDaniel Dunbar <daniel@zuster.org>
Thu, 29 Sep 2011 01:01:08 +0000 (01:01 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Thu, 29 Sep 2011 01:01:08 +0000 (01:01 +0000)
 - The TextDiagnosticPrinter code is still fragile as it is just "reverse engineering" what the diagnostic engine is doing. Not my current priority to fix though.

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

include/clang/Basic/DiagnosticIDs.h
lib/Basic/DiagnosticIDs.cpp
lib/Frontend/TextDiagnosticPrinter.cpp
test/Frontend/diagnostics-option-names.c [new file with mode: 0644]

index 6ff473346e86fe34ec7b84640e90a490d51396ab..e2884a539ac5b855c1b7cdca9f64d944d91bd1c9 100644 (file)
@@ -110,6 +110,10 @@ public:
   /// NOTEs.
   static bool isBuiltinWarningOrExtension(unsigned DiagID);
 
+  /// \brief Return true if the specified diagnostic is mapped to errors by
+  /// default.
+  static bool isDefaultMappingAsError(unsigned DiagID);
+
   /// \brief Determine whether the given built-in diagnostic ID is a
   /// Note.
   static bool isBuiltinNote(unsigned DiagID);
index 6e82ba5ff622df02f6b3ee4a5d5cace92af7260d..9347f9cb17015c4402b305910bea0b7156c20260 100644 (file)
@@ -458,6 +458,13 @@ bool DiagnosticIDs::isBuiltinExtensionDiag(unsigned DiagID,
   return true;
 }
 
+bool DiagnosticIDs::isDefaultMappingAsError(unsigned DiagID) {
+  if (DiagID >= diag::DIAG_UPPER_LIMIT)
+    return false;
+
+  return GetDefaultDiagMapping(DiagID) == diag::MAP_ERROR;
+}
+
 /// getDescription - Given a diagnostic ID, return a description of the
 /// issue.
 StringRef DiagnosticIDs::getDescription(unsigned DiagID) const {
index 378e673812dafe25c1048595a8e07355a7bdf282..6af66c797a98556b3d527ecdcd591fdbee26bd9f 100644 (file)
@@ -942,16 +942,20 @@ static void printDiagnosticOptions(raw_ostream &OS,
       return;
     }
 
-    // Was this a warning mapped to an error using -Werror or pragma?
+    // The code below is somewhat fragile because we are essentially trying to
+    // report to the user what happened by inferring what the diagnostic engine
+    // did. Eventually it might make more sense to have the diagnostic engine
+    // include some "why" information in the diagnostic.
+
+    // If this is a warning which has been mapped to an error by the user (as
+    // inferred by checking whether the default mapping is to an error) then
+    // flag it as such. Note that diagnostics could also have been mapped by a
+    // pragma, but we don't currently have a way to distinguish this.
     if (Level == DiagnosticsEngine::Error &&
-        DiagnosticIDs::isBuiltinWarningOrExtension(Info.getID())) {
-      diag::Mapping mapping = diag::MAP_IGNORE;
-      Info.getDiags()->getDiagnosticLevel(Info.getID(), Info.getLocation(), 
-                                          &mapping);
-      if (mapping == diag::MAP_WARNING) {
-        OS << " [-Werror";
-        Started = true;
-      }
+        DiagnosticIDs::isBuiltinWarningOrExtension(Info.getID()) &&
+        !DiagnosticIDs::isDefaultMappingAsError(Info.getID())) {
+      OS << " [-Werror";
+      Started = true;
     }
 
     // If the diagnostic is an extension diagnostic and not enabled by default
diff --git a/test/Frontend/diagnostics-option-names.c b/test/Frontend/diagnostics-option-names.c
new file mode 100644 (file)
index 0000000..ed0d2ed
--- /dev/null
@@ -0,0 +1,8 @@
+// RUN: not %clang_cc1 -fdiagnostics-show-option -Werror -Weverything %s 2> %t
+// RUN: FileCheck < %t %s
+
+int f0(int, unsigned);
+int f0(int x, unsigned y) {
+// CHECK: comparison of integers of different signs{{.*}} [-Werror,-Wsign-compare]
+  return x < y; // expected-error {{ : 'int' and 'unsigned int'  }}
+}