diff options
| -rw-r--r-- | clang/include/clang/Basic/DiagnosticIDs.h | 4 | ||||
| -rw-r--r-- | clang/lib/Basic/DiagnosticIDs.cpp | 7 | ||||
| -rw-r--r-- | clang/lib/Frontend/TextDiagnosticPrinter.cpp | 22 | ||||
| -rw-r--r-- | clang/test/Frontend/diagnostics-option-names.c | 8 | 
4 files changed, 32 insertions, 9 deletions
diff --git a/clang/include/clang/Basic/DiagnosticIDs.h b/clang/include/clang/Basic/DiagnosticIDs.h index 6ff473346e8..e2884a539ac 100644 --- a/clang/include/clang/Basic/DiagnosticIDs.h +++ b/clang/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/clang/lib/Basic/DiagnosticIDs.cpp b/clang/lib/Basic/DiagnosticIDs.cpp index 6e82ba5ff62..9347f9cb170 100644 --- a/clang/lib/Basic/DiagnosticIDs.cpp +++ b/clang/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/clang/lib/Frontend/TextDiagnosticPrinter.cpp b/clang/lib/Frontend/TextDiagnosticPrinter.cpp index 378e673812d..6af66c797a9 100644 --- a/clang/lib/Frontend/TextDiagnosticPrinter.cpp +++ b/clang/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/clang/test/Frontend/diagnostics-option-names.c b/clang/test/Frontend/diagnostics-option-names.c new file mode 100644 index 00000000000..ed0d2ed8ef9 --- /dev/null +++ b/clang/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'  }} +}  | 

