forked from OSchip/llvm-project
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. llvm-svn: 140752
This commit is contained in:
parent
cc5f8d4517
commit
aa11138543
|
@ -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);
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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' }}
|
||||
}
|
Loading…
Reference in New Issue