Diagnostic.h revision 0750618b0beacdc9b0a9e210a661e4746823ced7
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- Diagnostic.h - C Language Family Diagnostic Handling ---*- C++ -*-===// 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// The LLVM Compiler Infrastructure 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 55f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This file was developed by Chris Lattner and is distributed under 65f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// the University of Illinois Open Source License. See LICENSE.TXT for details. 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This file defines the Diagnostic-related interfaces. 115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#ifndef LLVM_CLANG_DIAGNOSTIC_H 155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define LLVM_CLANG_DIAGNOSTIC_H 165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <string> 18f86638365f4801ec2d2970f7c0663e94590618b8Chris Lattner#include <cassert> 195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace clang { 215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer class DiagnosticClient; 225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer class SourceLocation; 235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer class SourceRange; 245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Import the diagnostic enums themselves. 265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer namespace diag { 275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// diag::kind - All of the diagnostics that can be emitted by the frontend. 285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer enum kind { 295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define DIAG(ENUM,FLAGS,DESC) ENUM, 305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "DiagnosticKinds.def" 310750618b0beacdc9b0a9e210a661e4746823ced7Chris Lattner NUM_BUILTIN_DIAGNOSTICS 325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer }; 335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// Enum values that allow the client to map NOTEs, WARNINGs, and EXTENSIONs 355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// to either MAP_IGNORE (nothing), MAP_WARNING (emit a warning), MAP_ERROR 365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// (emit as an error), or MAP_DEFAULT (handle the default way). 375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer enum Mapping { 385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer MAP_DEFAULT = 0, //< Do not map this diagnostic. 395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer MAP_IGNORE = 1, //< Map this diagnostic to nothing, ignore it. 405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer MAP_WARNING = 2, //< Map this diagnostic to a warning. 415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer MAP_ERROR = 3 //< Map this diagnostic to an error. 425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer }; 435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// Diagnostic - This concrete class is used by the front-end to report 465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// problems and issues. It massages the diagnostics (e.g. handling things like 475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// "report warnings as errors" and passes them off to the DiagnosticClient for 485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// reporting to the user. 495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass Diagnostic { 505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool WarningsAsErrors; // Treat warnings like errors: 515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool WarnOnExtensions; // Enables warnings for gcc extensions: -pedantic. 525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool ErrorOnExtensions; // Error on extensions: -pedantic-errors. 535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer DiagnosticClient &Client; 545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// DiagMappings - Mapping information for diagnostics. Mapping info is 565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// packed into two bits per diagnostic. 570750618b0beacdc9b0a9e210a661e4746823ced7Chris Lattner unsigned char DiagMappings[(diag::NUM_BUILTIN_DIAGNOSTICS+3)/4]; 585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// ErrorOccurred - This is set to true when an error is emitted, and is 605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// sticky. 615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool ErrorOccurred; 625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned NumDiagnostics; // Number of diagnostics reported 645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned NumErrors; // Number of diagnostics that are errors 655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer explicit Diagnostic(DiagnosticClient &client); 675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer //===--------------------------------------------------------------------===// 695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Diagnostic characterization methods, used by a client to customize how 705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // 715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const DiagnosticClient &getClient() const { return Client; }; 725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// setWarningsAsErrors - When set to true, any warnings reported are issued 745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// as errors. 755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void setWarningsAsErrors(bool Val) { WarningsAsErrors = Val; } 765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool getWarningsAsErrors() const { return WarningsAsErrors; } 775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// setWarnOnExtensions - When set to true, issue warnings on GCC extensions, 795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// the equivalent of GCC's -pedantic. 805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void setWarnOnExtensions(bool Val) { WarnOnExtensions = Val; } 815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool getWarnOnExtensions() const { return WarnOnExtensions; } 825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// setErrorOnExtensions - When set to true issue errors for GCC extensions 845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// instead of warnings. This is the equivalent to GCC's -pedantic-errors. 855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void setErrorOnExtensions(bool Val) { ErrorOnExtensions = Val; } 865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool getErrorOnExtensions() const { return ErrorOnExtensions; } 875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// setDiagnosticMapping - This allows the client to specify that certain 895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// warnings are ignored. Only NOTEs, WARNINGs, and EXTENSIONs can be mapped. 905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void setDiagnosticMapping(diag::kind Diag, diag::Mapping Map) { 910750618b0beacdc9b0a9e210a661e4746823ced7Chris Lattner assert(Diag < diag::NUM_BUILTIN_DIAGNOSTICS && 920750618b0beacdc9b0a9e210a661e4746823ced7Chris Lattner "Can only map builtin diagnostics"); 930750618b0beacdc9b0a9e210a661e4746823ced7Chris Lattner assert(isBuiltinNoteWarningOrExtension(Diag) && "Cannot map errors!"); 945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned char &Slot = DiagMappings[Diag/4]; 955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned Bits = (Diag & 3)*2; 965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Slot &= ~(3 << Bits); 975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Slot |= Map << Bits; 985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getDiagnosticMapping - Return the mapping currently set for the specified 1015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// diagnostic. 1025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer diag::Mapping getDiagnosticMapping(diag::kind Diag) const { 1035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return (diag::Mapping)((DiagMappings[Diag/4] >> (Diag & 3)*2) & 3); 1045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool hasErrorOccurred() const { return ErrorOccurred; } 1075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned getNumErrors() const { return NumErrors; } 1095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned getNumDiagnostics() const { return NumDiagnostics; } 1105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer //===--------------------------------------------------------------------===// 1125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Diagnostic classification and reporting interfaces. 1135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // 1145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getDescription - Given a diagnostic ID, return a description of the 1165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// issue. 1170750618b0beacdc9b0a9e210a661e4746823ced7Chris Lattner const char *getDescription(unsigned DiagID); 1185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1190750618b0beacdc9b0a9e210a661e4746823ced7Chris Lattner /// Level - The level of the diagnostic, after it has been through mapping. 1205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer enum Level { 1213936c585cc07361a69cdf0c2c66c72f482b39dbeChris Lattner Ignored, Note, Warning, Error, Fatal 1225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer }; 1235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1240750618b0beacdc9b0a9e210a661e4746823ced7Chris Lattner /// isBuiltinNoteWarningOrExtension - Return true if the unmapped diagnostic 1250750618b0beacdc9b0a9e210a661e4746823ced7Chris Lattner /// level of the specified diagnostic ID is a Note, Warning, or Extension. 1260750618b0beacdc9b0a9e210a661e4746823ced7Chris Lattner /// Note that this only works on builtin diagnostics, not custom ones. 1270750618b0beacdc9b0a9e210a661e4746823ced7Chris Lattner static bool isBuiltinNoteWarningOrExtension(unsigned DiagID); 1285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getDiagnosticLevel - Based on the way the client configured the Diagnostic 1305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// object, classify the specified diagnostic ID into a Level, consumable by 1315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// the DiagnosticClient. 1325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Level getDiagnosticLevel(unsigned DiagID) const; 1335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// Report - Issue the message to the client. DiagID is a member of the 1355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// diag::kind enum. 1365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void Report(SourceLocation Pos, unsigned DiagID, 1375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const std::string *Strs = 0, unsigned NumStrs = 0, 1385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const SourceRange *Ranges = 0, unsigned NumRanges = 0); 1395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 1405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// DiagnosticClient - This is an abstract interface implemented by clients of 1425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// the front-end, which formats and prints fully processed diagnostics. 1435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass DiagnosticClient { 1445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 1455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer virtual ~DiagnosticClient(); 1465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// IgnoreDiagnostic - If the client wants to ignore this diagnostic, then 1485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// return true. 1495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer virtual bool IgnoreDiagnostic(Diagnostic::Level DiagLevel, 1505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation Pos) = 0; 1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// HandleDiagnostic - Handle this diagnostic, reporting it to the user or 1535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// capturing it to a log as needed. 1540750618b0beacdc9b0a9e210a661e4746823ced7Chris Lattner virtual void HandleDiagnostic(Diagnostic &Diags, 1550750618b0beacdc9b0a9e210a661e4746823ced7Chris Lattner Diagnostic::Level DiagLevel, SourceLocation Pos, 1565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer diag::kind ID, const std::string *Strs, 1575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned NumStrs, const SourceRange *Ranges, 1585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned NumRanges) = 0; 1595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 1605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} // end namespace clang 1625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif 164