Add --suppress-system-warnings (on by default, use =0 to disable)

- For investigating warnings in system headers / builtins.
 - Currently also enables the behavior that allows silent redefinition
   of types in system headers. Conceptually these are separate but I
   didn't feel it was worth two options (or changing LangOptions).

llvm-svn: 56163
This commit is contained in:
Daniel Dunbar 2008-09-12 18:10:20 +00:00
parent ec270fb640
commit 84b70f7f0f
4 changed files with 24 additions and 6 deletions

View File

@ -519,6 +519,11 @@ static llvm::cl::opt<bool>
ErrorOnExtensions("pedantic-errors", ErrorOnExtensions("pedantic-errors",
llvm::cl::desc("Issue an error on uses of GCC extensions")); llvm::cl::desc("Issue an error on uses of GCC extensions"));
static llvm::cl::opt<bool>
SuppressSystemWarnings("suppress-system-warnings",
llvm::cl::desc("Issue an error on uses of GCC extensions"),
llvm::cl::init(true));
static llvm::cl::opt<bool> static llvm::cl::opt<bool>
WarnUnusedMacros("Wunused_macros", WarnUnusedMacros("Wunused_macros",
llvm::cl::desc("Warn for unused macros in the main translation unit")); llvm::cl::desc("Warn for unused macros in the main translation unit"));
@ -547,6 +552,9 @@ static void InitializeDiagnostics(Diagnostic &Diags) {
Diags.setWarnOnExtensions(WarnOnExtensions); Diags.setWarnOnExtensions(WarnOnExtensions);
Diags.setErrorOnExtensions(ErrorOnExtensions); Diags.setErrorOnExtensions(ErrorOnExtensions);
// Suppress warnings in system headers unless requested not to.
Diags.setSuppressSystemWarnings(SuppressSystemWarnings);
// Silence the "macro is not used" warning unless requested. // Silence the "macro is not used" warning unless requested.
if (!WarnUnusedMacros) if (!WarnUnusedMacros)
Diags.setDiagnosticMapping(diag::pp_macro_not_used, diag::MAP_IGNORE); Diags.setDiagnosticMapping(diag::pp_macro_not_used, diag::MAP_IGNORE);

View File

@ -61,6 +61,7 @@ private:
bool WarningsAsErrors; // Treat warnings like errors: bool WarningsAsErrors; // Treat warnings like errors:
bool WarnOnExtensions; // Enables warnings for gcc extensions: -pedantic. bool WarnOnExtensions; // Enables warnings for gcc extensions: -pedantic.
bool ErrorOnExtensions; // Error on extensions: -pedantic-errors. bool ErrorOnExtensions; // Error on extensions: -pedantic-errors.
bool SuppressSystemWarnings;// Suppress warnings in system headers.
DiagnosticClient *Client; DiagnosticClient *Client;
/// DiagMappings - Mapping information for diagnostics. Mapping info is /// DiagMappings - Mapping information for diagnostics. Mapping info is
@ -110,6 +111,11 @@ public:
void setErrorOnExtensions(bool Val) { ErrorOnExtensions = Val; } void setErrorOnExtensions(bool Val) { ErrorOnExtensions = Val; }
bool getErrorOnExtensions() const { return ErrorOnExtensions; } bool getErrorOnExtensions() const { return ErrorOnExtensions; }
/// setSuppressSystemWarnings - When set to true mask warnings that
/// come from system headers.
void setSuppressSystemWarnings(bool Val) { SuppressSystemWarnings = Val; }
bool getSuppressSystemWarnings() const { return SuppressSystemWarnings; }
/// setDiagnosticMapping - This allows the client to specify that certain /// setDiagnosticMapping - This allows the client to specify that certain
/// warnings are ignored. Only NOTEs, WARNINGs, and EXTENSIONs can be mapped. /// warnings are ignored. Only NOTEs, WARNINGs, and EXTENSIONs can be mapped.
void setDiagnosticMapping(diag::kind Diag, diag::Mapping Map) { void setDiagnosticMapping(diag::kind Diag, diag::Mapping Map) {

View File

@ -113,6 +113,7 @@ Diagnostic::Diagnostic(DiagnosticClient *client) : Client(client) {
WarningsAsErrors = false; WarningsAsErrors = false;
WarnOnExtensions = false; WarnOnExtensions = false;
ErrorOnExtensions = false; ErrorOnExtensions = false;
SuppressSystemWarnings = false;
// Clear all mappings, setting them to MAP_DEFAULT. // Clear all mappings, setting them to MAP_DEFAULT.
memset(DiagMappings, 0, sizeof(DiagMappings)); memset(DiagMappings, 0, sizeof(DiagMappings));
@ -224,7 +225,8 @@ void Diagnostic::Report(DiagnosticClient* C,
// have to check on the original DiagID here, because we also want to // have to check on the original DiagID here, because we also want to
// ignore extensions and warnings in -Werror and -pedantic-errors modes, // ignore extensions and warnings in -Werror and -pedantic-errors modes,
// which *map* warnings/extensions to errors. // which *map* warnings/extensions to errors.
if (DiagID < diag::NUM_BUILTIN_DIAGNOSTICS && if (SuppressSystemWarnings &&
DiagID < diag::NUM_BUILTIN_DIAGNOSTICS &&
getBuiltinDiagClass(DiagID) != ERROR && getBuiltinDiagClass(DiagID) != ERROR &&
Loc.isValid() && Loc.isFileID() && Loc.isInSystemHeader()) Loc.isValid() && Loc.isFileID() && Loc.isInSystemHeader())
return; return;

View File

@ -276,11 +276,13 @@ TypedefDecl *Sema::MergeTypeDefDecl(TypedefDecl *New, Decl *OldD) {
// *either* declaration is in a system header. The code below implements // *either* declaration is in a system header. The code below implements
// this adhoc compatibility rule. FIXME: The following code will not // this adhoc compatibility rule. FIXME: The following code will not
// work properly when compiling ".i" files (containing preprocessed output). // work properly when compiling ".i" files (containing preprocessed output).
SourceManager &SrcMgr = Context.getSourceManager(); if (PP.getDiagnostics().getSuppressSystemWarnings()) {
if (SrcMgr.isInSystemHeader(Old->getLocation())) SourceManager &SrcMgr = Context.getSourceManager();
return New; if (SrcMgr.isInSystemHeader(Old->getLocation()))
if (SrcMgr.isInSystemHeader(New->getLocation())) return New;
return New; if (SrcMgr.isInSystemHeader(New->getLocation()))
return New;
}
Diag(New->getLocation(), diag::err_redefinition, New->getName()); Diag(New->getLocation(), diag::err_redefinition, New->getName());
Diag(Old->getLocation(), diag::err_previous_definition); Diag(Old->getLocation(), diag::err_previous_definition);