Fix PR1966 by ignoring non-error diagnostics from system headers even if they are

*mapped* onto errors.

llvm-svn: 46686
This commit is contained in:
Chris Lattner 2008-02-03 09:00:04 +00:00
parent 15e4ad81c3
commit 3ac9699c44
4 changed files with 21 additions and 22 deletions

View File

@ -200,6 +200,7 @@ Diagnostic::Level Diagnostic::getDiagnosticLevel(unsigned DiagID) const {
void Diagnostic::Report(FullSourceLoc Pos, unsigned DiagID,
const std::string *Strs, unsigned NumStrs,
const SourceRange *Ranges, unsigned NumRanges) {
// Figure out the diagnostic level of this message.
Diagnostic::Level DiagLevel = getDiagnosticLevel(DiagID);
@ -207,15 +208,20 @@ void Diagnostic::Report(FullSourceLoc Pos, unsigned DiagID,
if (DiagLevel == Diagnostic::Ignored)
return;
// If this is not an error and we are in a system header, ignore it. We have
// to check on the original class here, because we also want to ignore
// extensions and warnings in -Werror and -pedantic-errors modes, which *map*
// warnings/extensions to errors.
if (DiagID < diag::NUM_BUILTIN_DIAGNOSTICS &&
getBuiltinDiagClass(DiagID) != ERROR &&
Client.isInSystemHeader(Pos))
return;
if (DiagLevel >= Diagnostic::Error) {
ErrorOccurred = true;
++NumErrors;
}
// Are we going to ignore this diagnosic?
if (Client.IgnoreDiagnostic(DiagLevel, Pos))
return;
// Finally, report it.
Client.HandleDiagnostic(*this, DiagLevel, Pos, (diag::kind)DiagID,
Strs, NumStrs, Ranges, NumRanges);

View File

@ -39,20 +39,15 @@ std::string TextDiagnostics::FormatDiagnostic(Diagnostic &Diags,
return Msg;
}
bool TextDiagnostics::IgnoreDiagnostic(Diagnostic::Level Level,
FullSourceLoc Pos) {
if (Pos.isValid()) {
// If this is a warning or note, and if it a system header, suppress the
// diagnostic.
if (Level == Diagnostic::Warning || Level == Diagnostic::Note) {
bool TextDiagnostics::isInSystemHeader(FullSourceLoc Pos) const {
if (!Pos.isValid()) return false;
if (const FileEntry *F = Pos.getFileEntryForLoc()) {
DirectoryLookup::DirType DirInfo = TheHeaderSearch->getFileDirFlavor(F);
if (DirInfo == DirectoryLookup::SystemHeaderDir ||
DirInfo == DirectoryLookup::ExternCSystemHeaderDir)
return true;
}
}
}
return false;
}

View File

@ -34,8 +34,7 @@ public:
void setHeaderSearch(HeaderSearch &HS) { TheHeaderSearch = &HS; }
virtual bool IgnoreDiagnostic(Diagnostic::Level Level,
FullSourceLoc Pos);
virtual bool isInSystemHeader(FullSourceLoc Pos) const;
virtual void HandleDiagnostic(Diagnostic &Diags, Diagnostic::Level DiagLevel,
FullSourceLoc Pos,

View File

@ -166,10 +166,9 @@ class DiagnosticClient {
public:
virtual ~DiagnosticClient();
/// IgnoreDiagnostic - If the client wants to ignore this diagnostic, then
/// isInSystemHeader - If the client can tell that this is a system header,
/// return true.
virtual bool IgnoreDiagnostic(Diagnostic::Level DiagLevel,
FullSourceLoc Pos) = 0;
virtual bool isInSystemHeader(FullSourceLoc Pos) const { return false; }
/// HandleDiagnostic - Handle this diagnostic, reporting it to the user or
/// capturing it to a log as needed.