From 88eccaf06f9d88191723e71bdf5ca68409393be6 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 29 Jan 2009 06:55:46 +0000 Subject: [PATCH] Fix -Wimplicit-function-declaration, which required some refactoring and changes in various diagnostics code. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63282 91177308-0d34-0410-b5e6-96231b3b80d8 --- Driver/clang.cpp | 6 +++- include/clang/AST/ASTDiagnostic.h | 1 - include/clang/Analysis/AnalysisDiagnostic.h | 1 - include/clang/Basic/Diagnostic.h | 8 +++++ include/clang/Driver/DriverDiagnostic.h | 3 +- include/clang/Lex/LexDiagnostic.h | 1 - include/clang/Parse/ParseDiagnostic.h | 1 - include/clang/Sema/SemaDiagnostic.h | 2 +- lib/Basic/Diagnostic.cpp | 37 ++++++--------------- 9 files changed, 25 insertions(+), 35 deletions(-) diff --git a/Driver/clang.cpp b/Driver/clang.cpp index ca91fc682b..77d5ef7082 100644 --- a/Driver/clang.cpp +++ b/Driver/clang.cpp @@ -35,6 +35,7 @@ #include "clang/AST/TranslationUnit.h" #include "clang/CodeGen/ModuleBuilder.h" #include "clang/Sema/ParseAST.h" +#include "clang/Sema/SemaDiagnostic.h" #include "clang/AST/ASTConsumer.h" #include "clang/Parse/Parser.h" #include "clang/Lex/HeaderSearch.h" @@ -727,7 +728,10 @@ static void InitializeDiagnostics(Diagnostic &Diags) { if (!WarnUndefMacros) Diags.setDiagnosticMapping(diag::warn_pp_undef_identifier,diag::MAP_IGNORE); - if (!WarnImplicitFunctionDeclaration) + if (WarnImplicitFunctionDeclaration) + Diags.setDiagnosticMapping(diag::ext_implicit_function_decl, + diag::MAP_WARNING); + else Diags.setDiagnosticMapping(diag::warn_implicit_function_decl, diag::MAP_IGNORE); } diff --git a/include/clang/AST/ASTDiagnostic.h b/include/clang/AST/ASTDiagnostic.h index 8adc2cd0a2..ddb5b404e4 100644 --- a/include/clang/AST/ASTDiagnostic.h +++ b/include/clang/AST/ASTDiagnostic.h @@ -16,7 +16,6 @@ namespace clang { namespace diag { enum { #define DIAG(ENUM,FLAGS,DESC) ENUM, -#include "clang/Basic/DiagnosticCommonKinds.def" #define ASTSTART #include "clang/Basic/DiagnosticASTKinds.def" NUM_BUILTIN_AST_DIAGNOSTICS diff --git a/include/clang/Analysis/AnalysisDiagnostic.h b/include/clang/Analysis/AnalysisDiagnostic.h index 75d39e1d03..1f2f089100 100644 --- a/include/clang/Analysis/AnalysisDiagnostic.h +++ b/include/clang/Analysis/AnalysisDiagnostic.h @@ -16,7 +16,6 @@ namespace clang { namespace diag { enum { #define DIAG(ENUM,FLAGS,DESC) ENUM, -#include "clang/Basic/DiagnosticCommonKinds.def" #define ANALYSISSTART #include "clang/Basic/DiagnosticAnalysisKinds.def" NUM_BUILTIN_ANALYSIS_DIAGNOSTICS diff --git a/include/clang/Basic/Diagnostic.h b/include/clang/Basic/Diagnostic.h index c57e1a9a89..d9d32bcc5d 100644 --- a/include/clang/Basic/Diagnostic.h +++ b/include/clang/Basic/Diagnostic.h @@ -43,6 +43,14 @@ namespace clang { /// diag::kind - All of the diagnostics that can be emitted by the frontend. typedef unsigned kind; + // Get typedefs for common diagnostics. + enum { +#define DIAG(ENUM,FLAGS,DESC) ENUM, +#include "clang/Basic/DiagnosticCommonKinds.def" + NUM_BUILTIN_COMMON_DIAGNOSTICS +#undef DIAG + }; + /// Enum values that allow the client to map NOTEs, WARNINGs, and EXTENSIONs /// to either MAP_IGNORE (nothing), MAP_WARNING (emit a warning), MAP_ERROR /// (emit as an error), or MAP_DEFAULT (handle the default way). diff --git a/include/clang/Driver/DriverDiagnostic.h b/include/clang/Driver/DriverDiagnostic.h index 4afe5b23e8..459d17da4e 100644 --- a/include/clang/Driver/DriverDiagnostic.h +++ b/include/clang/Driver/DriverDiagnostic.h @@ -15,8 +15,7 @@ namespace clang { namespace diag { enum { -#define DIAG(ENUM,FLAGS,DESC) ENUM, -#include "clang/Basic/DiagnosticCommonKinds.def" +// FIXME: REMOVE?? NUM_BUILTIN_DRIVER_DIAGNOSTICS }; } // end namespace diag diff --git a/include/clang/Lex/LexDiagnostic.h b/include/clang/Lex/LexDiagnostic.h index 3d285cd6b5..202605fe5c 100644 --- a/include/clang/Lex/LexDiagnostic.h +++ b/include/clang/Lex/LexDiagnostic.h @@ -16,7 +16,6 @@ namespace clang { namespace diag { enum { #define DIAG(ENUM,FLAGS,DESC) ENUM, -#include "clang/Basic/DiagnosticCommonKinds.def" #define LEXSTART #include "clang/Basic/DiagnosticLexKinds.def" NUM_BUILTIN_LEX_DIAGNOSTICS diff --git a/include/clang/Parse/ParseDiagnostic.h b/include/clang/Parse/ParseDiagnostic.h index 12a4b2534f..52a89e8904 100644 --- a/include/clang/Parse/ParseDiagnostic.h +++ b/include/clang/Parse/ParseDiagnostic.h @@ -16,7 +16,6 @@ namespace clang { namespace diag { enum { #define DIAG(ENUM,FLAGS,DESC) ENUM, -#include "clang/Basic/DiagnosticCommonKinds.def" #define PARSESTART #include "clang/Basic/DiagnosticParseKinds.def" NUM_BUILTIN_PARSE_DIAGNOSTICS diff --git a/include/clang/Sema/SemaDiagnostic.h b/include/clang/Sema/SemaDiagnostic.h index 52fa696218..2819641ac9 100644 --- a/include/clang/Sema/SemaDiagnostic.h +++ b/include/clang/Sema/SemaDiagnostic.h @@ -16,9 +16,9 @@ namespace clang { namespace diag { enum { #define DIAG(ENUM,FLAGS,DESC) ENUM, -#include "clang/Basic/DiagnosticCommonKinds.def" #define SEMASTART #include "clang/Basic/DiagnosticSemaKinds.def" +#undef DIAG NUM_BUILTIN_SEMA_DIAGNOSTICS }; } // end namespace diag diff --git a/lib/Basic/Diagnostic.cpp b/lib/Basic/Diagnostic.cpp index ee0345b18d..6e39beb0c8 100644 --- a/lib/Basic/Diagnostic.cpp +++ b/lib/Basic/Diagnostic.cpp @@ -36,21 +36,6 @@ enum { class_mask = 0x07 }; -namespace clang { - namespace diag { - enum _kind{ -#define DIAG(ENUM,FLAGS,DESC) ENUM, -#define LEXSTART -#define PARSESTART -#define ASTSTART -#define SEMASTART -#define ANALYSISSTART -#include "clang/Basic/DiagnosticKinds.def" - NUM_BUILTIN_DIAGNOSTICS = DIAG_UPPER_LIMIT - }; - } -} - /// DiagnosticFlags - A set of flags, or'd together, that describe the /// diagnostic. #define DIAG(ENUM,FLAGS,DESC) FLAGS, @@ -83,7 +68,7 @@ static unsigned char DiagnosticFlagsAnalysis[] = { /// getDiagClass - Return the class field of the diagnostic. /// static unsigned getBuiltinDiagClass(unsigned DiagID) { - assert(DiagID < diag::NUM_BUILTIN_DIAGNOSTICS && + assert(DiagID < DIAG_UPPER_LIMIT && "Diagnostic ID out of range!"); unsigned res; if (DiagID < DIAG_START_LEX) @@ -145,16 +130,16 @@ namespace clang { /// getDescription - Return the description of the specified custom /// diagnostic. const char *getDescription(unsigned DiagID) const { - assert(this && DiagID-diag::NUM_BUILTIN_DIAGNOSTICS < DiagInfo.size() && + assert(this && DiagID-DIAG_UPPER_LIMIT < DiagInfo.size() && "Invalid diagnosic ID"); - return DiagInfo[DiagID-diag::NUM_BUILTIN_DIAGNOSTICS].second.c_str(); + return DiagInfo[DiagID-DIAG_UPPER_LIMIT].second.c_str(); } /// getLevel - Return the level of the specified custom diagnostic. Diagnostic::Level getLevel(unsigned DiagID) const { - assert(this && DiagID-diag::NUM_BUILTIN_DIAGNOSTICS < DiagInfo.size() && + assert(this && DiagID-DIAG_UPPER_LIMIT < DiagInfo.size() && "Invalid diagnosic ID"); - return DiagInfo[DiagID-diag::NUM_BUILTIN_DIAGNOSTICS].first; + return DiagInfo[DiagID-DIAG_UPPER_LIMIT].first; } unsigned getOrCreateDiagID(Diagnostic::Level L, const char *Message, @@ -166,7 +151,7 @@ namespace clang { return I->second; // If not, assign a new ID. - unsigned ID = DiagInfo.size()+diag::NUM_BUILTIN_DIAGNOSTICS; + unsigned ID = DiagInfo.size()+DIAG_UPPER_LIMIT; DiagIDs.insert(std::make_pair(D, ID)); DiagInfo.push_back(D); @@ -231,16 +216,14 @@ unsigned Diagnostic::getCustomDiagID(Level L, const char *Message) { /// level of the specified diagnostic ID is a Note, Warning, or Extension. /// Note that this only works on builtin diagnostics, not custom ones. bool Diagnostic::isBuiltinNoteWarningOrExtension(unsigned DiagID) { - return DiagID < diag::NUM_BUILTIN_DIAGNOSTICS && - getBuiltinDiagClass(DiagID) < ERROR; + return DiagID < DIAG_UPPER_LIMIT && getBuiltinDiagClass(DiagID) < ERROR; } /// getDescription - Given a diagnostic ID, return a description of the /// issue. const char *Diagnostic::getDescription(unsigned DiagID) const { - if (DiagID < diag::NUM_BUILTIN_DIAGNOSTICS) - { + if (DiagID < DIAG_UPPER_LIMIT) { if (DiagID < DIAG_START_LEX) return DiagnosticTextCommon[DiagID]; else if (DiagID < DIAG_START_PARSE) @@ -263,7 +246,7 @@ const char *Diagnostic::getDescription(unsigned DiagID) const { /// the DiagnosticClient. Diagnostic::Level Diagnostic::getDiagnosticLevel(unsigned DiagID) const { // Handle custom diagnostics, which cannot be mapped. - if (DiagID >= diag::NUM_BUILTIN_DIAGNOSTICS) + if (DiagID >= DIAG_UPPER_LIMIT) return CustomDiagInfo->getLevel(DiagID); unsigned DiagClass = getBuiltinDiagClass(DiagID); @@ -324,7 +307,7 @@ void Diagnostic::ProcessDiag() { // ignore extensions and warnings in -Werror and -pedantic-errors modes, // which *map* warnings/extensions to errors. if (SuppressSystemWarnings && - Info.getID() < diag::NUM_BUILTIN_DIAGNOSTICS && + Info.getID() < DIAG_UPPER_LIMIT && getBuiltinDiagClass(Info.getID()) != ERROR && Info.getLocation().isValid() && Info.getLocation().getSpellingLoc().isInSystemHeader())