diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Basic/Diagnostic.cpp | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/clang/lib/Basic/Diagnostic.cpp b/clang/lib/Basic/Diagnostic.cpp index caf30fac633..19bfeeea72a 100644 --- a/clang/lib/Basic/Diagnostic.cpp +++ b/clang/lib/Basic/Diagnostic.cpp @@ -43,7 +43,7 @@ struct DefaultMappingInfo { }; static const DefaultMappingInfo DefaultMappings[] = { -#define DIAG(ENUM,CLASS,DEFAULT_MAPPING,DESC) { diag::ENUM, DEFAULT_MAPPING }, +#define DIAG(ENUM,CLASS,DEFAULT_MAPPING,DESC) { diag::ENUM, DEFAULT_MAPPING-1 }, #include "clang/Basic/DiagnosticCommonKinds.inc" #include "clang/Basic/DiagnosticDriverKinds.inc" #include "clang/Basic/DiagnosticFrontendKinds.inc" @@ -56,6 +56,16 @@ static const DefaultMappingInfo DefaultMappings[] = { }; #undef DIAG +static unsigned GetDefaultDiagMapping(unsigned DiagID) { + // FIXME: Binary search. + for (unsigned i = 0, e = sizeof(DefaultMappings)/sizeof(DefaultMappings[0]); + i != e; ++i) + if (DefaultMappings[i].DiagID == DiagID) + return DefaultMappings[i].Mapping+1; + return diag::MAP_FATAL; +} + + // Diagnostic classes. enum { CLASS_NOTE = 0x01, @@ -264,11 +274,8 @@ Diagnostic::Diagnostic(DiagnosticClient *client) : Client(client) { ArgToStringFn = DummyArgToStringFn; ArgToStringCookie = 0; - // Set all mappings to their default. - for (unsigned i = 0, e = sizeof(DefaultMappings)/sizeof(DefaultMappings[0]); - i != e; ++i) - setDiagnosticMappingInternal(DefaultMappings[i].DiagID, - DefaultMappings[i].Mapping); + // Set all mappings to 'unset'. + memset(DiagMappings, 0, sizeof(DiagMappings)); } Diagnostic::~Diagnostic() { @@ -353,7 +360,16 @@ Diagnostic::getDiagnosticLevel(unsigned DiagID, unsigned DiagClass) const { // Specific non-error diagnostics may be mapped to various levels from ignored // to error. Errors can only be mapped to fatal. Diagnostic::Level Result = Diagnostic::Fatal; - switch (getDiagnosticMapping((diag::kind)DiagID)) { + + // Get the mapping information, if unset, compute it lazily. + unsigned MappingInfo = getDiagnosticMappingInfo((diag::kind)DiagID); + if (MappingInfo == 0) { + MappingInfo = GetDefaultDiagMapping(DiagID); + setDiagnosticMappingInternal(DiagID, MappingInfo, false); + } + + switch (MappingInfo & 7) { + default: assert(0 && "Unknown mapping!"); case diag::MAP_IGNORE: return Diagnostic::Ignored; case diag::MAP_ERROR: |