DiagnosticIDs.h revision b1c99c679adb53be8f478d08be83af6c9c22ae4b
133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis//===--- DiagnosticIDs.h - Diagnostic IDs Handling --------------*- C++ -*-===// 233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis// 333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis// The LLVM Compiler Infrastructure 433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis// 533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source 633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis// License. See LICENSE.TXT for details. 733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis// 833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis// 1033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis// This file defines the Diagnostic IDs-related interfaces. 1133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis// 1233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 1333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 1433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#ifndef LLVM_CLANG_DIAGNOSTICIDS_H 1533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#define LLVM_CLANG_DIAGNOSTICIDS_H 1633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 1733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#include "llvm/ADT/IntrusiveRefCntPtr.h" 1833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#include "llvm/ADT/StringRef.h" 19686775deca8b8685eb90801495880e3abdd844c2Chris Lattner#include "clang/Basic/LLVM.h" 2033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 2133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidisnamespace clang { 22d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie class DiagnosticsEngine; 230827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis class SourceLocation; 2433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 2533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis // Import the diagnostic enums themselves. 2633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis namespace diag { 2733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis // Start position for diagnostics. 2833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis enum { 2933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis DIAG_START_DRIVER = 300, 3033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis DIAG_START_FRONTEND = DIAG_START_DRIVER + 100, 31f84109ee6aeffb09366bd70c8593ce1b7818b1adFariborz Jahanian DIAG_START_LEX = DIAG_START_FRONTEND + 120, 3233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis DIAG_START_PARSE = DIAG_START_LEX + 300, 3333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis DIAG_START_AST = DIAG_START_PARSE + 300, 3433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis DIAG_START_SEMA = DIAG_START_AST + 100, 35d24eda8ad42bea6b36400d5505f67a7917d65652Chandler Carruth DIAG_START_ANALYSIS = DIAG_START_SEMA + 3000, 3633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis DIAG_UPPER_LIMIT = DIAG_START_ANALYSIS + 100 3733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis }; 3833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 3933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis class CustomDiagInfo; 4033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 4133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// diag::kind - All of the diagnostics that can be emitted by the frontend. 4233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis typedef unsigned kind; 4333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 4433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis // Get typedefs for common diagnostics. 4533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis enum { 467d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor#define DIAG(ENUM,FLAGS,DEFAULT_MAPPING,DESC,GROUP,\ 474213df3b5da21ce25a4541ca5c447eeb28b515a3Daniel Dunbar SFINAE,ACCESS,CATEGORY,NOWERROR,SHOWINSYSHEADER,BRIEF,FULL) ENUM, 4833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#include "clang/Basic/DiagnosticCommonKinds.inc" 4933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis NUM_BUILTIN_COMMON_DIAGNOSTICS 5033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#undef DIAG 5133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis }; 5233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 5333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// Enum values that allow the client to map NOTEs, WARNINGs, and EXTENSIONs 5433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// to either MAP_IGNORE (nothing), MAP_WARNING (emit a warning), MAP_ERROR 5533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// (emit as an error). It allows clients to map errors to 5633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// MAP_ERROR/MAP_DEFAULT or MAP_FATAL (stop emitting diagnostics after this 5733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// one). 5833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis enum Mapping { 5933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis // NOTE: 0 means "uncomputed". 6033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis MAP_IGNORE = 1, //< Map this diagnostic to nothing, ignore it. 6133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis MAP_WARNING = 2, //< Map this diagnostic to a warning. 6233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis MAP_ERROR = 3, //< Map this diagnostic to an error. 6333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis MAP_FATAL = 4, //< Map this diagnostic to a fatal error. 6433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 6533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// Map this diagnostic to "warning", but make it immune to -Werror. This 6633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// happens when you specify -Wno-error=foo. 6733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis MAP_WARNING_NO_WERROR = 5, 68144bc08f5fe6046bd8e07de5e41a4237dd2c6275Argyrios Kyrtzidis /// Map this diagnostic to "warning", but make it immune to 69144bc08f5fe6046bd8e07de5e41a4237dd2c6275Argyrios Kyrtzidis /// -Wno-system-headers. 70144bc08f5fe6046bd8e07de5e41a4237dd2c6275Argyrios Kyrtzidis MAP_WARNING_SHOW_IN_SYSTEM_HEADER = 6, 7133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// Map this diagnostic to "error", but make it immune to -Wfatal-errors. 7233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// This happens for -Wno-fatal-errors=foo. 73144bc08f5fe6046bd8e07de5e41a4237dd2c6275Argyrios Kyrtzidis MAP_ERROR_NO_WFATAL = 7 7433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis }; 7533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis } 7633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 77b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbarclass DiagnosticMappingInfo { 78b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar unsigned Mapping : 3; 79b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar unsigned IsUser : 1; 80b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar unsigned IsPragma : 1; 81b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar 82b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbarpublic: 83b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar static DiagnosticMappingInfo MakeUnset() { 84b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar DiagnosticMappingInfo Result; 85b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar Result.Mapping = Result.IsUser = Result.IsPragma = 0; 86b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar return Result; 87b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar } 88b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar 89b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar static DiagnosticMappingInfo MakeInfo(diag::Mapping Mapping, 90b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar bool IsUser, bool IsPragma) { 91b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar DiagnosticMappingInfo Result; 92b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar Result.Mapping = Mapping; 93b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar Result.IsUser = IsUser; 94b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar Result.IsPragma = IsPragma; 95b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar return Result; 96b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar } 97b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar 98b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar diag::Mapping getMapping() const { return diag::Mapping(Mapping); } 99b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar bool isUser() const { return IsUser; } 100b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar bool isPragma() const { return IsPragma; } 101b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar 102b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar bool isUnset() const { return Mapping == 0; } 103b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar}; 104b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar 10533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis/// \brief Used for handling and querying diagnostic IDs. Can be used and shared 10633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis/// by multiple Diagnostics for multiple translation units. 10733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidisclass DiagnosticIDs : public llvm::RefCountedBase<DiagnosticIDs> { 10833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidispublic: 10933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// Level - The level of the diagnostic, after it has been through mapping. 11033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis enum Level { 11133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis Ignored, Note, Warning, Error, Fatal 11233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis }; 11333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 11433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidisprivate: 11533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// CustomDiagInfo - Information for uniquing and looking up custom diags. 11633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis diag::CustomDiagInfo *CustomDiagInfo; 11733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 11833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidispublic: 11933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis DiagnosticIDs(); 12033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis ~DiagnosticIDs(); 12133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 12233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// getCustomDiagID - Return an ID for a diagnostic with the specified message 12333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// and level. If this is the first request for this diagnosic, it is 12433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// registered and created, otherwise the existing ID is returned. 125686775deca8b8685eb90801495880e3abdd844c2Chris Lattner unsigned getCustomDiagID(Level L, StringRef Message); 12633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 12733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis //===--------------------------------------------------------------------===// 12833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis // Diagnostic classification and reporting interfaces. 12933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis // 13033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 13133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// getDescription - Given a diagnostic ID, return a description of the 13233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// issue. 133686775deca8b8685eb90801495880e3abdd844c2Chris Lattner StringRef getDescription(unsigned DiagID) const; 13433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 13580d572d87e2a8258262fd9caa463ae9c046f7bf0Daniel Dunbar /// isBuiltinWarningOrExtension - Return true if the unmapped diagnostic level 13680d572d87e2a8258262fd9caa463ae9c046f7bf0Daniel Dunbar /// of the specified diagnostic ID is a Warning or Extension. This only works 13780d572d87e2a8258262fd9caa463ae9c046f7bf0Daniel Dunbar /// on builtin diagnostics, not custom ones, and is not legal to call on 13880d572d87e2a8258262fd9caa463ae9c046f7bf0Daniel Dunbar /// NOTEs. 13933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis static bool isBuiltinWarningOrExtension(unsigned DiagID); 14033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 14176101cfe52d1b56974bf0e316247b3201f87c463Daniel Dunbar /// \brief Return true if the specified diagnostic is mapped to errors by 14276101cfe52d1b56974bf0e316247b3201f87c463Daniel Dunbar /// default. 14376101cfe52d1b56974bf0e316247b3201f87c463Daniel Dunbar static bool isDefaultMappingAsError(unsigned DiagID); 14476101cfe52d1b56974bf0e316247b3201f87c463Daniel Dunbar 14533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// \brief Determine whether the given built-in diagnostic ID is a 14633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// Note. 14733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis static bool isBuiltinNote(unsigned DiagID); 14833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 14933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// isBuiltinExtensionDiag - Determine whether the given built-in diagnostic 15033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// ID is for an extension of some sort. 15133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// 15233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis static bool isBuiltinExtensionDiag(unsigned DiagID) { 15333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis bool ignored; 15433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis return isBuiltinExtensionDiag(DiagID, ignored); 15533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis } 15633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 15733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// isBuiltinExtensionDiag - Determine whether the given built-in diagnostic 15833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// ID is for an extension of some sort. This also returns EnabledByDefault, 15933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// which is set to indicate whether the diagnostic is ignored by default (in 16033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// which case -pedantic enables it) or treated as a warning/error by default. 16133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// 16233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis static bool isBuiltinExtensionDiag(unsigned DiagID, bool &EnabledByDefault); 16333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 16433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 16533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// getWarningOptionForDiag - Return the lowest-level warning option that 16633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// enables the specified diagnostic. If there is no -Wfoo flag that controls 16733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// the diagnostic, this returns null. 168686775deca8b8685eb90801495880e3abdd844c2Chris Lattner static StringRef getWarningOptionForDiag(unsigned DiagID); 169477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis 1707d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor /// getCategoryNumberForDiag - Return the category number that a specified 17133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// DiagID belongs to, or 0 if no category. 17233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis static unsigned getCategoryNumberForDiag(unsigned DiagID); 17333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 174477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis /// getNumberOfCategories - Return the number of categories 175477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis static unsigned getNumberOfCategories(); 176477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis 17733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// getCategoryNameFromID - Given a category ID, return the name of the 17833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// category. 179686775deca8b8685eb90801495880e3abdd844c2Chris Lattner static StringRef getCategoryNameFromID(unsigned CategoryID); 18033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 18133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// \brief Enumeration describing how the the emission of a diagnostic should 18233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// be treated when it occurs during C++ template argument deduction. 18333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis enum SFINAEResponse { 18433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// \brief The diagnostic should not be reported, but it should cause 18533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// template argument deduction to fail. 18633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// 18733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// The vast majority of errors that occur during template argument 18833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// deduction fall into this category. 18933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis SFINAE_SubstitutionFailure, 19033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 19133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// \brief The diagnostic should be suppressed entirely. 19233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// 19333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// Warnings generally fall into this category. 19433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis SFINAE_Suppress, 19533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 19633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// \brief The diagnostic should be reported. 19733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// 19833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// The diagnostic should be reported. Various fatal errors (e.g., 19933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// template instantiation depth exceeded) fall into this category. 200418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor SFINAE_Report, 201418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor 202418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor /// \brief The diagnostic is an access-control diagnostic, which will be 203418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor /// substitution failures in some contexts and reported in others. 204418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor SFINAE_AccessControl 20533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis }; 20633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 20733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// \brief Determines whether the given built-in diagnostic ID is 20833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// for an error that is suppressed if it occurs during C++ template 20933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// argument deduction. 21033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// 21133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// When an error is suppressed due to SFINAE, the template argument 21233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// deduction fails but no diagnostic is emitted. Certain classes of 21333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// errors, such as those errors that involve C++ access control, 21433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// are not SFINAE errors. 21533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis static SFINAEResponse getDiagnosticSFINAEResponse(unsigned DiagID); 21633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 2177d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor /// getName - Given a diagnostic ID, return its name 218686775deca8b8685eb90801495880e3abdd844c2Chris Lattner static StringRef getName(unsigned DiagID); 2197d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor 2207d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor /// getIdFromName - Given a diagnostic name, return its ID, or 0 221686775deca8b8685eb90801495880e3abdd844c2Chris Lattner static unsigned getIdFromName(StringRef Name); 2227d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor 2237d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor /// getBriefExplanation - Given a diagnostic ID, return a brief explanation 2247d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor /// of the issue 225686775deca8b8685eb90801495880e3abdd844c2Chris Lattner static StringRef getBriefExplanation(unsigned DiagID); 2267d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor 2277d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor /// getFullExplanation - Given a diagnostic ID, return a full explanation 2287d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor /// of the issue 229686775deca8b8685eb90801495880e3abdd844c2Chris Lattner static StringRef getFullExplanation(unsigned DiagID); 2306948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek 2316948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek /// Iterator class used for traversing all statically declared 2326948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek /// diagnostics. 2336948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek class diag_iterator { 2346948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek const void *impl; 2356948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek 2366948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek friend class DiagnosticIDs; 237cb9657cfba92d5a3009e1b37109e03258c20d327Bill Wendling diag_iterator(const void *im) : impl(im) {} 2386948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek public: 2396948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek diag_iterator &operator++(); 2406948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek bool operator==(const diag_iterator &x) const { return impl == x.impl; } 2416948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek bool operator!=(const diag_iterator &x) const { return impl != x.impl; } 2426948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek 2436948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek llvm::StringRef getDiagName() const; 2446948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek unsigned getDiagID() const; 2456948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek }; 2466948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek 2476948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek static diag_iterator diags_begin(); 2486948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek static diag_iterator diags_end(); 2497d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor 25033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidisprivate: 25133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// setDiagnosticGroupMapping - Change an entire diagnostic group (e.g. 25233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// "unknown-pragmas" to have the specified mapping. This returns true and 25333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// ignores the request if "Group" was unknown, false otherwise. 254686775deca8b8685eb90801495880e3abdd844c2Chris Lattner bool setDiagnosticGroupMapping(StringRef Group, diag::Mapping Map, 255d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie SourceLocation Loc, 256d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie DiagnosticsEngine &Diag) const; 25733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 258d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie /// \brief Based on the way the client configured the DiagnosticsEngine 25933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// object, classify the specified diagnostic ID into a Level, consumable by 26033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// the DiagnosticClient. 2610827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis /// 2620827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis /// \param Loc The source location we are interested in finding out the 2630827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis /// diagnostic state. Can be null in order to query the latest state. 2640827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis DiagnosticIDs::Level getDiagnosticLevel(unsigned DiagID, SourceLocation Loc, 2651656aaec223949245fdbebf306b719cba0b687caDaniel Dunbar const DiagnosticsEngine &Diag) const; 26633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 26733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// getDiagnosticLevel - This is an internal implementation helper used when 26833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// DiagClass is already known. 26933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis DiagnosticIDs::Level getDiagnosticLevel(unsigned DiagID, 27033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis unsigned DiagClass, 2710827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis SourceLocation Loc, 2721656aaec223949245fdbebf306b719cba0b687caDaniel Dunbar const DiagnosticsEngine &Diag) const; 27333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 27433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// ProcessDiag - This is the method used to report a diagnostic that is 27533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// finally fully formed. 27633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// 27733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// \returns true if the diagnostic was emitted, false if it was 27833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// suppressed. 279d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie bool ProcessDiag(DiagnosticsEngine &Diag) const; 28033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 281add80bb3957dba1d9389304453c0a4c975768bd7John McCall /// \brief Whether the diagnostic may leave the AST in a state where some 282add80bb3957dba1d9389304453c0a4c975768bd7John McCall /// invariants can break. 283add80bb3957dba1d9389304453c0a4c975768bd7John McCall bool isUnrecoverable(unsigned DiagID) const; 284add80bb3957dba1d9389304453c0a4c975768bd7John McCall 285d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie friend class DiagnosticsEngine; 28633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis}; 28733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 28833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis} // end namespace clang 28933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 29033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#endif 291