From: Daniel Dunbar Date: Thu, 29 Sep 2011 01:01:08 +0000 (+0000) Subject: Basic/Diagnostics: Add an isDefaultMappingAsError method, and switch TextDiagnosticPr... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=76101cfe52d1b56974bf0e316247b3201f87c463;p=clang Basic/Diagnostics: Add an isDefaultMappingAsError method, and switch TextDiagnosticPrinter to use that instead of extracting the current mapping via getDiagnosticLevel, which fixes one class of corner cases w.r.t. printing the "-Werror" diagnostic option marker. - 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 --- diff --git a/include/clang/Basic/DiagnosticIDs.h b/include/clang/Basic/DiagnosticIDs.h index 6ff473346e..e2884a539a 100644 --- a/include/clang/Basic/DiagnosticIDs.h +++ b/include/clang/Basic/DiagnosticIDs.h @@ -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); diff --git a/lib/Basic/DiagnosticIDs.cpp b/lib/Basic/DiagnosticIDs.cpp index 6e82ba5ff6..9347f9cb17 100644 --- a/lib/Basic/DiagnosticIDs.cpp +++ b/lib/Basic/DiagnosticIDs.cpp @@ -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 { diff --git a/lib/Frontend/TextDiagnosticPrinter.cpp b/lib/Frontend/TextDiagnosticPrinter.cpp index 378e673812..6af66c797a 100644 --- a/lib/Frontend/TextDiagnosticPrinter.cpp +++ b/lib/Frontend/TextDiagnosticPrinter.cpp @@ -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 index 0000000000..ed0d2ed8ef --- /dev/null +++ b/test/Frontend/diagnostics-option-names.c @@ -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' }} +}