forked from OSchip/llvm-project
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:
parent
15e4ad81c3
commit
3ac9699c44
|
@ -200,22 +200,28 @@ 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);
|
||||
|
||||
// If the client doesn't care about this message, don't issue it.
|
||||
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);
|
||||
|
|
|
@ -39,19 +39,14 @@ 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) {
|
||||
if (const FileEntry *F = Pos.getFileEntryForLoc()) {
|
||||
DirectoryLookup::DirType DirInfo = TheHeaderSearch->getFileDirFlavor(F);
|
||||
if (DirInfo == DirectoryLookup::SystemHeaderDir ||
|
||||
DirInfo == DirectoryLookup::ExternCSystemHeaderDir)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue