forked from OSchip/llvm-project
Make diagnostic class explicit in the diag record instead of
implicit from its parenting. Now that diag mapping is explicit, eliminate the fatal and extwarn classes. llvm-svn: 69177
This commit is contained in:
parent
06a7f37265
commit
e6c831deb2
|
@ -19,6 +19,14 @@ def MAP_WARNING : DiagMapping;
|
|||
def MAP_ERROR : DiagMapping;
|
||||
def MAP_FATAL : DiagMapping;
|
||||
|
||||
// Define the diagnostic classes.
|
||||
class DiagClass;
|
||||
def CLASS_NOTE : DiagClass;
|
||||
def CLASS_WARNING : DiagClass;
|
||||
def CLASS_EXTENSION : DiagClass;
|
||||
def CLASS_ERROR : DiagClass;
|
||||
|
||||
|
||||
/*
|
||||
class Option<string name, list<OptionControlled> members> : OptionControlled {
|
||||
string Name = name;
|
||||
|
@ -31,18 +39,19 @@ include "DiagnosticOptions.td"
|
|||
*/
|
||||
|
||||
// All diagnostics emitted by the compiler are an indirect subclass of this.
|
||||
class Diagnostic<string text, DiagMapping defaultmapping> {
|
||||
class Diagnostic<string text, DiagClass DC, DiagMapping defaultmapping> {
|
||||
/// Component is specified by the file with a big let directive.
|
||||
string Component = ?;
|
||||
string Text = text;
|
||||
DiagClass Class = DC;
|
||||
DiagMapping DefaultMapping = defaultmapping;
|
||||
}
|
||||
|
||||
class Error<string text> : Diagnostic<text, MAP_ERROR>;
|
||||
class Warning<string text> : Diagnostic<text, MAP_WARNING>;
|
||||
class Extension<string text> : Diagnostic<text, MAP_IGNORE>;
|
||||
class ExtWarn<string text> : Diagnostic<text, MAP_WARNING>;
|
||||
class Note<string text> : Diagnostic<text, MAP_FATAL /*ignored*/>;
|
||||
class Error<string str> : Diagnostic<str, CLASS_ERROR, MAP_ERROR>;
|
||||
class Warning<string str> : Diagnostic<str, CLASS_WARNING, MAP_WARNING>;
|
||||
class Extension<string str> : Diagnostic<str, CLASS_EXTENSION, MAP_IGNORE>;
|
||||
class ExtWarn<string str> : Diagnostic<str, CLASS_EXTENSION, MAP_WARNING>;
|
||||
class Note<string str> : Diagnostic<str, CLASS_NOTE, MAP_FATAL/*ignored*/>;
|
||||
|
||||
// Definitions for Diagnostics.
|
||||
include "DiagnosticASTKinds.td"
|
||||
|
|
|
@ -54,15 +54,14 @@ static const DefaultMappingInfo DefaultMappings[] = {
|
|||
#include "clang/Basic/DiagnosticAnalysisKinds.inc"
|
||||
{ 0, 0 }
|
||||
};
|
||||
#undef DIAG
|
||||
|
||||
// Diagnostic classes.
|
||||
enum {
|
||||
NOTE = 0x01,
|
||||
WARNING = 0x02,
|
||||
EXTENSION = 0x03,
|
||||
EXTWARN = 0x04,
|
||||
ERROR = 0x05,
|
||||
FATAL = 0x06
|
||||
CLASS_NOTE = 0x01,
|
||||
CLASS_WARNING = 0x02,
|
||||
CLASS_EXTENSION = 0x03,
|
||||
CLASS_ERROR = 0x04
|
||||
};
|
||||
|
||||
/// DiagnosticClasses - The class for each diagnostic.
|
||||
|
@ -272,24 +271,23 @@ unsigned Diagnostic::getCustomDiagID(Level L, const char *Message) {
|
|||
/// This only works on builtin diagnostics, not custom ones, and is not legal to
|
||||
/// call on NOTEs.
|
||||
bool Diagnostic::isBuiltinWarningOrExtension(unsigned DiagID) {
|
||||
return DiagID < diag::DIAG_UPPER_LIMIT && getBuiltinDiagClass(DiagID) < ERROR;
|
||||
return DiagID < diag::DIAG_UPPER_LIMIT &&
|
||||
getBuiltinDiagClass(DiagID) != CLASS_ERROR;
|
||||
}
|
||||
|
||||
/// \brief Determine whether the given built-in diagnostic ID is a
|
||||
/// Note.
|
||||
bool Diagnostic::isBuiltinNote(unsigned DiagID) {
|
||||
return DiagID < diag::DIAG_UPPER_LIMIT && getBuiltinDiagClass(DiagID) == NOTE;
|
||||
return DiagID < diag::DIAG_UPPER_LIMIT &&
|
||||
getBuiltinDiagClass(DiagID) == CLASS_NOTE;
|
||||
}
|
||||
|
||||
/// isBuiltinExtensionDiag - Determine whether the given built-in diagnostic
|
||||
/// ID is for an extension of some sort.
|
||||
///
|
||||
bool Diagnostic::isBuiltinExtensionDiag(unsigned DiagID) {
|
||||
if (DiagID < diag::DIAG_UPPER_LIMIT) {
|
||||
unsigned Class = getBuiltinDiagClass(DiagID);
|
||||
return Class == EXTENSION || Class == EXTWARN;
|
||||
}
|
||||
return false;
|
||||
return DiagID < diag::DIAG_UPPER_LIMIT &&
|
||||
getBuiltinDiagClass(DiagID) == CLASS_EXTENSION;
|
||||
}
|
||||
|
||||
|
||||
|
@ -324,7 +322,7 @@ Diagnostic::Level Diagnostic::getDiagnosticLevel(unsigned DiagID) const {
|
|||
return CustomDiagInfo->getLevel(DiagID);
|
||||
|
||||
unsigned DiagClass = getBuiltinDiagClass(DiagID);
|
||||
assert(DiagClass != NOTE && "Cannot get the diagnostic level of a note!");
|
||||
assert(DiagClass != CLASS_NOTE && "Cannot get diagnostic level of a note!");
|
||||
return getDiagnosticLevel(DiagID, DiagClass);
|
||||
}
|
||||
|
||||
|
@ -386,7 +384,7 @@ void Diagnostic::ProcessDiag() {
|
|||
// the diagnostic level was for the previous diagnostic so that it is
|
||||
// filtered the same as the previous diagnostic.
|
||||
unsigned DiagClass = getBuiltinDiagClass(DiagID);
|
||||
if (DiagClass == NOTE) {
|
||||
if (DiagClass == CLASS_NOTE) {
|
||||
DiagLevel = Diagnostic::Note;
|
||||
ShouldEmitInSystemHeader = false; // extra consideration is needed
|
||||
} else {
|
||||
|
@ -394,7 +392,7 @@ void Diagnostic::ProcessDiag() {
|
|||
// Check the original Diag ID here, because we also want to ignore
|
||||
// extensions and warnings in -Werror and -pedantic-errors modes, which
|
||||
// *map* warnings/extensions to errors.
|
||||
ShouldEmitInSystemHeader = DiagClass == ERROR;
|
||||
ShouldEmitInSystemHeader = DiagClass == CLASS_ERROR;
|
||||
|
||||
DiagLevel = getDiagnosticLevel(DiagID, DiagClass);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue