Diagnostic.h revision f86638365f4801ec2d2970f7c0663e94590618b8
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" 315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer NUM_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. 575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned char DiagMappings[(diag::NUM_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) { 915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(isNoteWarningOrExtension(Diag) && "Cannot map errors!"); 925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned char &Slot = DiagMappings[Diag/4]; 935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned Bits = (Diag & 3)*2; 945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Slot &= ~(3 << Bits); 955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Slot |= Map << Bits; 965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getDiagnosticMapping - Return the mapping currently set for the specified 995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// diagnostic. 1005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer diag::Mapping getDiagnosticMapping(diag::kind Diag) const { 1015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return (diag::Mapping)((DiagMappings[Diag/4] >> (Diag & 3)*2) & 3); 1025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool hasErrorOccurred() const { return ErrorOccurred; } 1055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned getNumErrors() const { return NumErrors; } 1075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned getNumDiagnostics() const { return NumDiagnostics; } 1085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer //===--------------------------------------------------------------------===// 1105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Diagnostic classification and reporting interfaces. 1115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // 1125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getDescription - Given a diagnostic ID, return a description of the 1145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// issue. 1155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static const char *getDescription(unsigned DiagID); 1165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// Level - The level of the diagnostic 1185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer enum Level { 1195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Ignored, Note, Warning, Error, Fatal, Sorry 1205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer }; 1215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// isNoteWarningOrExtension - Return true if the unmapped diagnostic level of 1235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// the specified diagnostic ID is a Note, Warning, or Extension. 1245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer static bool isNoteWarningOrExtension(unsigned DiagID); 1255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getDiagnosticLevel - Based on the way the client configured the Diagnostic 1275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// object, classify the specified diagnostic ID into a Level, consumable by 1285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// the DiagnosticClient. 1295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Level getDiagnosticLevel(unsigned DiagID) const; 1305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// Report - Issue the message to the client. DiagID is a member of the 1325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// diag::kind enum. 1335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void Report(SourceLocation Pos, unsigned DiagID, 1345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const std::string *Strs = 0, unsigned NumStrs = 0, 1355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const SourceRange *Ranges = 0, unsigned NumRanges = 0); 1365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 1375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// DiagnosticClient - This is an abstract interface implemented by clients of 1395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// the front-end, which formats and prints fully processed diagnostics. 1405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass DiagnosticClient { 1415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 1425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer virtual ~DiagnosticClient(); 1435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// IgnoreDiagnostic - If the client wants to ignore this diagnostic, then 1455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// return true. 1465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer virtual bool IgnoreDiagnostic(Diagnostic::Level DiagLevel, 1475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation Pos) = 0; 1485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// HandleDiagnostic - Handle this diagnostic, reporting it to the user or 1505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// capturing it to a log as needed. 1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer virtual void HandleDiagnostic(Diagnostic::Level DiagLevel, SourceLocation Pos, 1525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer diag::kind ID, const std::string *Strs, 1535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned NumStrs, const SourceRange *Ranges, 1545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned NumRanges) = 0; 1555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 1565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} // end namespace clang 1585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif 160