/// \brief Based on the way the client configured the Diagnostic /// object, classify the specified diagnostic ID into a Level, consumable by /// the DiagnosticClient. /// /// \param Loc The source location we are interested in finding out the /// diagnostic state. Can be null in order to query the latest state. DiagnosticIDs::Level DiagnosticIDs::getDiagnosticLevel(unsigned DiagID, unsigned DiagClass, SourceLocation Loc, const Diagnostic &Diag, diag::Mapping *mapping) const { // Specific non-error diagnostics may be mapped to various levels from ignored // to error. Errors can only be mapped to fatal. DiagnosticIDs::Level Result = DiagnosticIDs::Fatal; Diagnostic::DiagStatePointsTy::iterator Pos = Diag.GetDiagStatePointForLoc(Loc); Diagnostic::DiagState *State = Pos->State; // Get the mapping information, if unset, compute it lazily. unsigned MappingInfo = Diag.getDiagnosticMappingInfo((diag::kind)DiagID, State); if (MappingInfo == 0) { MappingInfo = GetDefaultDiagMapping(DiagID); Diag.setDiagnosticMappingInternal(DiagID, MappingInfo, State, false, false); } if (mapping) *mapping = (diag::Mapping) (MappingInfo & 7); bool ShouldEmitInSystemHeader = false; switch (MappingInfo & 7) { default: assert(0 && "Unknown mapping!"); case diag::MAP_IGNORE: // Ignore this, unless this is an extension diagnostic and we're mapping // them onto warnings or errors. if (!isBuiltinExtensionDiag(DiagID) || // Not an extension Diag.ExtBehavior == Diagnostic::Ext_Ignore || // Ext ignored (MappingInfo & 8) != 0) // User explicitly mapped it. return DiagnosticIDs::Ignored; Result = DiagnosticIDs::Warning; if (Diag.ExtBehavior == Diagnostic::Ext_Error) Result = DiagnosticIDs::Error; if (Result == DiagnosticIDs::Error && Diag.ErrorsAsFatal) Result = DiagnosticIDs::Fatal; break; case diag::MAP_ERROR: Result = DiagnosticIDs::Error; if (Diag.ErrorsAsFatal) Result = DiagnosticIDs::Fatal; break; case diag::MAP_FATAL: Result = DiagnosticIDs::Fatal; break; case diag::MAP_WARNING_SHOW_IN_SYSTEM_HEADER: ShouldEmitInSystemHeader = true; // continue as MAP_WARNING. case diag::MAP_WARNING: // If warnings are globally mapped to ignore or error, do it. if (Diag.IgnoreAllWarnings) return DiagnosticIDs::Ignored; Result = DiagnosticIDs::Warning; // If this is an extension diagnostic and we're in -pedantic-error mode, and // if the user didn't explicitly map it, upgrade to an error. if (Diag.ExtBehavior == Diagnostic::Ext_Error && (MappingInfo & 8) == 0 && isBuiltinExtensionDiag(DiagID)) Result = DiagnosticIDs::Error; if (Diag.WarningsAsErrors) Result = DiagnosticIDs::Error; if (Result == DiagnosticIDs::Error && Diag.ErrorsAsFatal) Result = DiagnosticIDs::Fatal; break; case diag::MAP_WARNING_NO_WERROR: // Diagnostics specified with -Wno-error=foo should be set to warnings, but // not be adjusted by -Werror or -pedantic-errors. Result = DiagnosticIDs::Warning; // If warnings are globally mapped to ignore or error, do it. if (Diag.IgnoreAllWarnings) return DiagnosticIDs::Ignored; break; case diag::MAP_ERROR_NO_WFATAL: // Diagnostics specified as -Wno-fatal-error=foo should be errors, but // unaffected by -Wfatal-errors. Result = DiagnosticIDs::Error; break; } // Okay, we're about to return this as a "diagnostic to emit" one last check: // if this is any sort of extension warning, and if we're in an __extension__ // block, silence it. if (Diag.AllExtensionsSilenced && isBuiltinExtensionDiag(DiagID)) return DiagnosticIDs::Ignored; // If we are in a system header, we ignore it. // We also want to ignore extensions and warnings in -Werror and // -pedantic-errors modes, which *map* warnings/extensions to errors. if (Result >= DiagnosticIDs::Warning && DiagClass != CLASS_ERROR && // Custom diagnostics always are emitted in system headers. DiagID < diag::DIAG_UPPER_LIMIT && !ShouldEmitInSystemHeader && Diag.SuppressSystemWarnings && Loc.isValid() && Diag.getSourceManager().isInSystemHeader( Diag.getSourceManager().getInstantiationLoc(Loc))) return DiagnosticIDs::Ignored; return Result; }
/// \brief Based on the way the client configured the Diagnostic /// object, classify the specified diagnostic ID into a Level, consumable by /// the DiagnosticClient. /// /// \param Loc The source location we are interested in finding out the /// diagnostic state. Can be null in order to query the latest state. DiagnosticIDs::Level DiagnosticIDs::getDiagnosticLevel(unsigned DiagID, unsigned DiagClass, SourceLocation Loc, const Diagnostic &Diag, diag::Mapping *mapping) const { // Specific non-error diagnostics may be mapped to various levels from ignored // to error. Errors can only be mapped to fatal. DiagnosticIDs::Level Result = DiagnosticIDs::Fatal; Diagnostic::DiagStatePointsTy::iterator Pos = Diag.GetDiagStatePointForLoc(Loc); Diagnostic::DiagState *State = Pos->State; // Get the mapping information, if unset, compute it lazily. unsigned MappingInfo = Diag.getDiagnosticMappingInfo((diag::kind)DiagID, State); if (MappingInfo == 0) { MappingInfo = GetDefaultDiagMapping(DiagID); Diag.setDiagnosticMappingInternal(DiagID, MappingInfo, State, false, false); } if (mapping) *mapping = (diag::Mapping) (MappingInfo & 7); switch (MappingInfo & 7) { default: assert(0 && "Unknown mapping!"); case diag::MAP_IGNORE: // Ignore this, unless this is an extension diagnostic and we're mapping // them onto warnings or errors. if (!isBuiltinExtensionDiag(DiagID) || // Not an extension Diag.ExtBehavior == Diagnostic::Ext_Ignore || // Ext ignored (MappingInfo & 8) != 0) // User explicitly mapped it. return DiagnosticIDs::Ignored; Result = DiagnosticIDs::Warning; if (Diag.ExtBehavior == Diagnostic::Ext_Error) Result = DiagnosticIDs::Error; if (Result == DiagnosticIDs::Error && Diag.ErrorsAsFatal) Result = DiagnosticIDs::Fatal; break; case diag::MAP_ERROR: Result = DiagnosticIDs::Error; if (Diag.ErrorsAsFatal) Result = DiagnosticIDs::Fatal; break; case diag::MAP_FATAL: Result = DiagnosticIDs::Fatal; break; case diag::MAP_WARNING: // If warnings are globally mapped to ignore or error, do it. if (Diag.IgnoreAllWarnings) return DiagnosticIDs::Ignored; Result = DiagnosticIDs::Warning; // If this is an extension diagnostic and we're in -pedantic-error mode, and // if the user didn't explicitly map it, upgrade to an error. if (Diag.ExtBehavior == Diagnostic::Ext_Error && (MappingInfo & 8) == 0 && isBuiltinExtensionDiag(DiagID)) Result = DiagnosticIDs::Error; if (Diag.WarningsAsErrors) Result = DiagnosticIDs::Error; if (Result == DiagnosticIDs::Error && Diag.ErrorsAsFatal) Result = DiagnosticIDs::Fatal; break; case diag::MAP_WARNING_NO_WERROR: // Diagnostics specified with -Wno-error=foo should be set to warnings, but // not be adjusted by -Werror or -pedantic-errors. Result = DiagnosticIDs::Warning; // If warnings are globally mapped to ignore or error, do it. if (Diag.IgnoreAllWarnings) return DiagnosticIDs::Ignored; break; case diag::MAP_ERROR_NO_WFATAL: // Diagnostics specified as -Wno-fatal-error=foo should be errors, but // unaffected by -Wfatal-errors. Result = DiagnosticIDs::Error; break; } // Okay, we're about to return this as a "diagnostic to emit" one last check: // if this is any sort of extension warning, and if we're in an __extension__ // block, silence it. if (Diag.AllExtensionsSilenced && isBuiltinExtensionDiag(DiagID)) return DiagnosticIDs::Ignored; return Result; }