DiagnosticIDs.h revision ebcb57a8d298862c65043e88b2429591ab3c58d3
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 213f8394669673451061f57ced81f0a2cae087f119Daniel Dunbarnamespace llvm { 223f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar template<typename T, unsigned> class SmallVector; 233f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar} 243f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar 2533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidisnamespace clang { 26d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie class DiagnosticsEngine; 270827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis class SourceLocation; 283f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar struct WarningOption; 2933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 3033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis // Import the diagnostic enums themselves. 3133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis namespace diag { 3233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis // Start position for diagnostics. 3333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis enum { 34a2398d7da920b896001f385587e7f7d3366e5b17Chandler Carruth DIAG_START_DRIVER = 300, 35a2398d7da920b896001f385587e7f7d3366e5b17Chandler Carruth DIAG_START_FRONTEND = DIAG_START_DRIVER + 100, 36a2398d7da920b896001f385587e7f7d3366e5b17Chandler Carruth DIAG_START_SERIALIZATION = DIAG_START_FRONTEND + 100, 37a2398d7da920b896001f385587e7f7d3366e5b17Chandler Carruth DIAG_START_LEX = DIAG_START_SERIALIZATION + 120, 38a2398d7da920b896001f385587e7f7d3366e5b17Chandler Carruth DIAG_START_PARSE = DIAG_START_LEX + 300, 39ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek DIAG_START_AST = DIAG_START_PARSE + 400, 40a2398d7da920b896001f385587e7f7d3366e5b17Chandler Carruth DIAG_START_SEMA = DIAG_START_AST + 100, 41a2398d7da920b896001f385587e7f7d3366e5b17Chandler Carruth DIAG_START_ANALYSIS = DIAG_START_SEMA + 3000, 42a2398d7da920b896001f385587e7f7d3366e5b17Chandler Carruth DIAG_UPPER_LIMIT = DIAG_START_ANALYSIS + 100 4333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis }; 4433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 4533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis class CustomDiagInfo; 4633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 4733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// diag::kind - All of the diagnostics that can be emitted by the frontend. 4833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis typedef unsigned kind; 4933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 5033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis // Get typedefs for common diagnostics. 5133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis enum { 527d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor#define DIAG(ENUM,FLAGS,DEFAULT_MAPPING,DESC,GROUP,\ 53f94d392847fb183b3012dbcb2e372b586c80b9fbBenjamin Kramer SFINAE,ACCESS,CATEGORY,NOWERROR,SHOWINSYSHEADER) ENUM, 5433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#include "clang/Basic/DiagnosticCommonKinds.inc" 5533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis NUM_BUILTIN_COMMON_DIAGNOSTICS 5633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#undef DIAG 5733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis }; 5833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 5933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// Enum values that allow the client to map NOTEs, WARNINGs, and EXTENSIONs 6033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// to either MAP_IGNORE (nothing), MAP_WARNING (emit a warning), MAP_ERROR 6133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// (emit as an error). It allows clients to map errors to 6233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// MAP_ERROR/MAP_DEFAULT or MAP_FATAL (stop emitting diagnostics after this 6333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// one). 6433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis enum Mapping { 6533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis // NOTE: 0 means "uncomputed". 6633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis MAP_IGNORE = 1, //< Map this diagnostic to nothing, ignore it. 6733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis MAP_WARNING = 2, //< Map this diagnostic to a warning. 6833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis MAP_ERROR = 3, //< Map this diagnostic to an error. 69be1aa410274b28fc143c47c814f07c989f4534d6Daniel Dunbar MAP_FATAL = 4 //< Map this diagnostic to a fatal error. 7033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis }; 7133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis } 7233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 73b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbarclass DiagnosticMappingInfo { 74b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar unsigned Mapping : 3; 75b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar unsigned IsUser : 1; 76b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar unsigned IsPragma : 1; 77a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar unsigned HasShowInSystemHeader : 1; 78a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar unsigned HasNoWarningAsError : 1; 79a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar unsigned HasNoErrorAsFatal : 1; 80b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar 81b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbarpublic: 82aeacae523a1c6e5bb99d12754415bbbc3ccb86c9Daniel Dunbar static DiagnosticMappingInfo Make(diag::Mapping Mapping, bool IsUser, 83aeacae523a1c6e5bb99d12754415bbbc3ccb86c9Daniel Dunbar bool IsPragma) { 84b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar DiagnosticMappingInfo Result; 85b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar Result.Mapping = Mapping; 86b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar Result.IsUser = IsUser; 87b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar Result.IsPragma = IsPragma; 88a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar Result.HasShowInSystemHeader = 0; 89a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar Result.HasNoWarningAsError = 0; 90a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar Result.HasNoErrorAsFatal = 0; 91b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar return Result; 92b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar } 93b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar 94b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar diag::Mapping getMapping() const { return diag::Mapping(Mapping); } 95a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar void setMapping(diag::Mapping Value) { Mapping = Value; } 96a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar 97b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar bool isUser() const { return IsUser; } 98b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar bool isPragma() const { return IsPragma; } 99b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar 100a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar bool hasShowInSystemHeader() const { return HasShowInSystemHeader; } 101a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar void setShowInSystemHeader(bool Value) { HasShowInSystemHeader = Value; } 102a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar 103a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar bool hasNoWarningAsError() const { return HasNoWarningAsError; } 104a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar void setNoWarningAsError(bool Value) { HasNoWarningAsError = Value; } 105a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar 106a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar bool hasNoErrorAsFatal() const { return HasNoErrorAsFatal; } 107a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar void setNoErrorAsFatal(bool Value) { HasNoErrorAsFatal = Value; } 108b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar}; 109b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar 11033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis/// \brief Used for handling and querying diagnostic IDs. Can be used and shared 11133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis/// by multiple Diagnostics for multiple translation units. 112c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmithclass DiagnosticIDs : public RefCountedBase<DiagnosticIDs> { 11333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidispublic: 11433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// Level - The level of the diagnostic, after it has been through mapping. 11533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis enum Level { 11633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis Ignored, Note, Warning, Error, Fatal 11733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis }; 11833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 11933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidisprivate: 12033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// CustomDiagInfo - Information for uniquing and looking up custom diags. 12133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis diag::CustomDiagInfo *CustomDiagInfo; 12233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 12333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidispublic: 12433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis DiagnosticIDs(); 12533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis ~DiagnosticIDs(); 12633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 12733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// getCustomDiagID - Return an ID for a diagnostic with the specified message 12833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// and level. If this is the first request for this diagnosic, it is 12933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// registered and created, otherwise the existing ID is returned. 130686775deca8b8685eb90801495880e3abdd844c2Chris Lattner unsigned getCustomDiagID(Level L, StringRef Message); 13133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 13233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis //===--------------------------------------------------------------------===// 13333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis // Diagnostic classification and reporting interfaces. 13433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis // 13533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 13633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// getDescription - Given a diagnostic ID, return a description of the 13733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// issue. 138686775deca8b8685eb90801495880e3abdd844c2Chris Lattner StringRef getDescription(unsigned DiagID) const; 13933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 14080d572d87e2a8258262fd9caa463ae9c046f7bf0Daniel Dunbar /// isBuiltinWarningOrExtension - Return true if the unmapped diagnostic level 14180d572d87e2a8258262fd9caa463ae9c046f7bf0Daniel Dunbar /// of the specified diagnostic ID is a Warning or Extension. This only works 14280d572d87e2a8258262fd9caa463ae9c046f7bf0Daniel Dunbar /// on builtin diagnostics, not custom ones, and is not legal to call on 14380d572d87e2a8258262fd9caa463ae9c046f7bf0Daniel Dunbar /// NOTEs. 14433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis static bool isBuiltinWarningOrExtension(unsigned DiagID); 14533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 14676101cfe52d1b56974bf0e316247b3201f87c463Daniel Dunbar /// \brief Return true if the specified diagnostic is mapped to errors by 14776101cfe52d1b56974bf0e316247b3201f87c463Daniel Dunbar /// default. 14876101cfe52d1b56974bf0e316247b3201f87c463Daniel Dunbar static bool isDefaultMappingAsError(unsigned DiagID); 14976101cfe52d1b56974bf0e316247b3201f87c463Daniel Dunbar 15033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// \brief Determine whether the given built-in diagnostic ID is a 15133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// Note. 15233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis static bool isBuiltinNote(unsigned DiagID); 15333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 15433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// isBuiltinExtensionDiag - Determine whether the given built-in diagnostic 15533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// ID is for an extension of some sort. 15633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// 15733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis static bool isBuiltinExtensionDiag(unsigned DiagID) { 15833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis bool ignored; 15933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis return isBuiltinExtensionDiag(DiagID, ignored); 16033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis } 16133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 16233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// isBuiltinExtensionDiag - Determine whether the given built-in diagnostic 16333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// ID is for an extension of some sort. This also returns EnabledByDefault, 16433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// which is set to indicate whether the diagnostic is ignored by default (in 16533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// which case -pedantic enables it) or treated as a warning/error by default. 16633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// 16733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis static bool isBuiltinExtensionDiag(unsigned DiagID, bool &EnabledByDefault); 16833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 16933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 17033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// getWarningOptionForDiag - Return the lowest-level warning option that 17133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// enables the specified diagnostic. If there is no -Wfoo flag that controls 17233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// the diagnostic, this returns null. 173686775deca8b8685eb90801495880e3abdd844c2Chris Lattner static StringRef getWarningOptionForDiag(unsigned DiagID); 174477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis 1757d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor /// getCategoryNumberForDiag - Return the category number that a specified 17633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// DiagID belongs to, or 0 if no category. 17733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis static unsigned getCategoryNumberForDiag(unsigned DiagID); 17833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 179477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis /// getNumberOfCategories - Return the number of categories 180477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis static unsigned getNumberOfCategories(); 181477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis 18233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// getCategoryNameFromID - Given a category ID, return the name of the 18333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// category. 184686775deca8b8685eb90801495880e3abdd844c2Chris Lattner static StringRef getCategoryNameFromID(unsigned CategoryID); 18533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 186afdc21ad774eff6ed6c464e3f2dff9e26ed3d0b0Ted Kremenek /// isARCDiagnostic - Return true if a given diagnostic falls into an 187afdc21ad774eff6ed6c464e3f2dff9e26ed3d0b0Ted Kremenek /// ARC diagnostic category; 188afdc21ad774eff6ed6c464e3f2dff9e26ed3d0b0Ted Kremenek static bool isARCDiagnostic(unsigned DiagID); 189afdc21ad774eff6ed6c464e3f2dff9e26ed3d0b0Ted Kremenek 19033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// \brief Enumeration describing how the the emission of a diagnostic should 19133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// be treated when it occurs during C++ template argument deduction. 19233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis enum SFINAEResponse { 19333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// \brief The diagnostic should not be reported, but it should cause 19433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// template argument deduction to fail. 19533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// 19633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// The vast majority of errors that occur during template argument 19733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// deduction fall into this category. 19833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis SFINAE_SubstitutionFailure, 19933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 20033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// \brief The diagnostic should be suppressed entirely. 20133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// 20233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// Warnings generally fall into this category. 20333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis SFINAE_Suppress, 20433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 20533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// \brief The diagnostic should be reported. 20633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// 20733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// The diagnostic should be reported. Various fatal errors (e.g., 20833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// template instantiation depth exceeded) fall into this category. 209418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor SFINAE_Report, 210418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor 211418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor /// \brief The diagnostic is an access-control diagnostic, which will be 212418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor /// substitution failures in some contexts and reported in others. 213418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor SFINAE_AccessControl 21433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis }; 21533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 21633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// \brief Determines whether the given built-in diagnostic ID is 21733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// for an error that is suppressed if it occurs during C++ template 21833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// argument deduction. 21933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// 22033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// When an error is suppressed due to SFINAE, the template argument 22133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// deduction fails but no diagnostic is emitted. Certain classes of 22233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// errors, such as those errors that involve C++ access control, 22333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// are not SFINAE errors. 22433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis static SFINAEResponse getDiagnosticSFINAEResponse(unsigned DiagID); 22533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 2263f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar /// \brief Get the set of all diagnostic IDs in the group with the given name. 2273f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar /// 2283f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar /// \param Diags [out] - On return, the diagnostics in the group. 2293f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar /// \returns True if the given group is unknown, false otherwise. 2303f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar bool getDiagnosticsInGroup(StringRef Group, 2313f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar llvm::SmallVectorImpl<diag::kind> &Diags) const; 23233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 23311583c757bac6ce5c342f2eb572055dd2619a657Argyrios Kyrtzidis /// \brief Get the set of all diagnostic IDs. 23411583c757bac6ce5c342f2eb572055dd2619a657Argyrios Kyrtzidis void getAllDiagnostics(llvm::SmallVectorImpl<diag::kind> &Diags) const; 23511583c757bac6ce5c342f2eb572055dd2619a657Argyrios Kyrtzidis 236a70cb9db9dd79ca9fc1febbb2f331004297664e0Benjamin Kramer /// \brief Get the warning option with the closest edit distance to the given 237a70cb9db9dd79ca9fc1febbb2f331004297664e0Benjamin Kramer /// group name. 238a70cb9db9dd79ca9fc1febbb2f331004297664e0Benjamin Kramer static StringRef getNearestWarningOption(StringRef Group); 239a70cb9db9dd79ca9fc1febbb2f331004297664e0Benjamin Kramer 240d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenekprivate: 2413f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar /// \brief Get the set of all diagnostic IDs in the given group. 2423f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar /// 2433f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar /// \param Diags [out] - On return, the diagnostics in the group. 2443f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar void getDiagnosticsInGroup(const WarningOption *Group, 2453f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar llvm::SmallVectorImpl<diag::kind> &Diags) const; 2463f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar 247d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie /// \brief Based on the way the client configured the DiagnosticsEngine 24833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// object, classify the specified diagnostic ID into a Level, consumable by 24933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// the DiagnosticClient. 2500827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis /// 2510827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis /// \param Loc The source location we are interested in finding out the 2520827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis /// diagnostic state. Can be null in order to query the latest state. 2530827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis DiagnosticIDs::Level getDiagnosticLevel(unsigned DiagID, SourceLocation Loc, 2541656aaec223949245fdbebf306b719cba0b687caDaniel Dunbar const DiagnosticsEngine &Diag) const; 25533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 25633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// getDiagnosticLevel - This is an internal implementation helper used when 25733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// DiagClass is already known. 25833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis DiagnosticIDs::Level getDiagnosticLevel(unsigned DiagID, 25933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis unsigned DiagClass, 2600827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis SourceLocation Loc, 2611656aaec223949245fdbebf306b719cba0b687caDaniel Dunbar const DiagnosticsEngine &Diag) const; 26233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 26333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// ProcessDiag - This is the method used to report a diagnostic that is 26433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// finally fully formed. 26533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// 26633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// \returns true if the diagnostic was emitted, false if it was 26733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// suppressed. 268d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie bool ProcessDiag(DiagnosticsEngine &Diag) const; 26933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 270add80bb3957dba1d9389304453c0a4c975768bd7John McCall /// \brief Whether the diagnostic may leave the AST in a state where some 271add80bb3957dba1d9389304453c0a4c975768bd7John McCall /// invariants can break. 272add80bb3957dba1d9389304453c0a4c975768bd7John McCall bool isUnrecoverable(unsigned DiagID) const; 273add80bb3957dba1d9389304453c0a4c975768bd7John McCall 274d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie friend class DiagnosticsEngine; 27533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis}; 27633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 27733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis} // end namespace clang 27833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 27933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#endif 280