DiagnosticIDs.h revision cfa88f893915ceb8ae4ce2f17c46c24a4d67502f
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//===----------------------------------------------------------------------===// 92f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett/// 102f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett/// \file 112f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett/// \brief Defines the Diagnostic IDs-related interfaces. 122f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett/// 1333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 1433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 1533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#ifndef LLVM_CLANG_DIAGNOSTICIDS_H 1633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#define LLVM_CLANG_DIAGNOSTICIDS_H 1733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 1830a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "clang/Basic/LLVM.h" 1933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#include "llvm/ADT/IntrusiveRefCntPtr.h" 2033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#include "llvm/ADT/StringRef.h" 2133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 2233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidisnamespace clang { 23d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie class DiagnosticsEngine; 240827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis class SourceLocation; 253f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar struct WarningOption; 2633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 2733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis // Import the diagnostic enums themselves. 2833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis namespace diag { 2933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis // Start position for diagnostics. 3033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis enum { 31a2398d7da920b896001f385587e7f7d3366e5b17Chandler Carruth DIAG_START_DRIVER = 300, 32a2398d7da920b896001f385587e7f7d3366e5b17Chandler Carruth DIAG_START_FRONTEND = DIAG_START_DRIVER + 100, 33a2398d7da920b896001f385587e7f7d3366e5b17Chandler Carruth DIAG_START_SERIALIZATION = DIAG_START_FRONTEND + 100, 34a2398d7da920b896001f385587e7f7d3366e5b17Chandler Carruth DIAG_START_LEX = DIAG_START_SERIALIZATION + 120, 35a2398d7da920b896001f385587e7f7d3366e5b17Chandler Carruth DIAG_START_PARSE = DIAG_START_LEX + 300, 36ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek DIAG_START_AST = DIAG_START_PARSE + 400, 37a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko DIAG_START_COMMENT = DIAG_START_AST + 100, 38a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko DIAG_START_SEMA = DIAG_START_COMMENT + 100, 39a2398d7da920b896001f385587e7f7d3366e5b17Chandler Carruth DIAG_START_ANALYSIS = DIAG_START_SEMA + 3000, 40a2398d7da920b896001f385587e7f7d3366e5b17Chandler Carruth DIAG_UPPER_LIMIT = DIAG_START_ANALYSIS + 100 4133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis }; 4233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 4333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis class CustomDiagInfo; 4433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 45af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \brief All of the diagnostics that can be emitted by the frontend. 4633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis typedef unsigned kind; 4733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 4833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis // Get typedefs for common diagnostics. 4933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis enum { 507d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor#define DIAG(ENUM,FLAGS,DEFAULT_MAPPING,DESC,GROUP,\ 51f94d392847fb183b3012dbcb2e372b586c80b9fbBenjamin Kramer SFINAE,ACCESS,CATEGORY,NOWERROR,SHOWINSYSHEADER) ENUM, 5233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#include "clang/Basic/DiagnosticCommonKinds.inc" 5333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis NUM_BUILTIN_COMMON_DIAGNOSTICS 5433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#undef DIAG 5533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis }; 5633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 5733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// Enum values that allow the client to map NOTEs, WARNINGs, and EXTENSIONs 5833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// to either MAP_IGNORE (nothing), MAP_WARNING (emit a warning), MAP_ERROR 5933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// (emit as an error). It allows clients to map errors to 6033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// MAP_ERROR/MAP_DEFAULT or MAP_FATAL (stop emitting diagnostics after this 6133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// one). 6233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis enum Mapping { 6333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis // NOTE: 0 means "uncomputed". 6449fdccb4595862828aa5cadc1497d466a8031ddaDmitri Gribenko MAP_IGNORE = 1, ///< Map this diagnostic to nothing, ignore it. 6549fdccb4595862828aa5cadc1497d466a8031ddaDmitri Gribenko MAP_WARNING = 2, ///< Map this diagnostic to a warning. 6649fdccb4595862828aa5cadc1497d466a8031ddaDmitri Gribenko MAP_ERROR = 3, ///< Map this diagnostic to an error. 6749fdccb4595862828aa5cadc1497d466a8031ddaDmitri Gribenko MAP_FATAL = 4 ///< Map this diagnostic to a fatal error. 6833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis }; 6933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis } 7033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 71b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbarclass DiagnosticMappingInfo { 72b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar unsigned Mapping : 3; 73b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar unsigned IsUser : 1; 74b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar unsigned IsPragma : 1; 75a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar unsigned HasShowInSystemHeader : 1; 76a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar unsigned HasNoWarningAsError : 1; 77a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar unsigned HasNoErrorAsFatal : 1; 78b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar 79b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbarpublic: 80aeacae523a1c6e5bb99d12754415bbbc3ccb86c9Daniel Dunbar static DiagnosticMappingInfo Make(diag::Mapping Mapping, bool IsUser, 81aeacae523a1c6e5bb99d12754415bbbc3ccb86c9Daniel Dunbar bool IsPragma) { 82b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar DiagnosticMappingInfo Result; 83b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar Result.Mapping = Mapping; 84b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar Result.IsUser = IsUser; 85b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar Result.IsPragma = IsPragma; 86a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar Result.HasShowInSystemHeader = 0; 87a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar Result.HasNoWarningAsError = 0; 88a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar Result.HasNoErrorAsFatal = 0; 89b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar return Result; 90b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar } 91b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar 92b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar diag::Mapping getMapping() const { return diag::Mapping(Mapping); } 93a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar void setMapping(diag::Mapping Value) { Mapping = Value; } 94a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar 95b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar bool isUser() const { return IsUser; } 96b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar bool isPragma() const { return IsPragma; } 97b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar 98a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar bool hasShowInSystemHeader() const { return HasShowInSystemHeader; } 99a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar void setShowInSystemHeader(bool Value) { HasShowInSystemHeader = Value; } 100a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar 101a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar bool hasNoWarningAsError() const { return HasNoWarningAsError; } 102a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar void setNoWarningAsError(bool Value) { HasNoWarningAsError = Value; } 103a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar 104a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar bool hasNoErrorAsFatal() const { return HasNoErrorAsFatal; } 105a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar void setNoErrorAsFatal(bool Value) { HasNoErrorAsFatal = Value; } 106b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar}; 107b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar 10833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis/// \brief Used for handling and querying diagnostic IDs. Can be used and shared 10933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis/// by multiple Diagnostics for multiple translation units. 110c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmithclass DiagnosticIDs : public RefCountedBase<DiagnosticIDs> { 11133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidispublic: 112af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// Level The level of the diagnostic, after it has been through mapping. 11333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis enum Level { 11433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis Ignored, Note, Warning, Error, Fatal 11533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis }; 11633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 11733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidisprivate: 118af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \brief Information for uniquing and looking up custom diags. 11933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis diag::CustomDiagInfo *CustomDiagInfo; 12033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 12133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidispublic: 12233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis DiagnosticIDs(); 12333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis ~DiagnosticIDs(); 12433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 125af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \brief Return an ID for a diagnostic with the specified message and level. 126af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// 127af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// If this is the first request for this diagnosic, it is registered and 128af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// created, otherwise the existing ID is returned. 129686775deca8b8685eb90801495880e3abdd844c2Chris Lattner unsigned getCustomDiagID(Level L, StringRef Message); 13033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 13133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis //===--------------------------------------------------------------------===// 13233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis // Diagnostic classification and reporting interfaces. 13333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis // 13433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 135af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \brief Given a diagnostic ID, return a description of the issue. 136686775deca8b8685eb90801495880e3abdd844c2Chris Lattner StringRef getDescription(unsigned DiagID) const; 13733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 138af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \brief Return true if the unmapped diagnostic levelof the specified 139af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// diagnostic ID is a Warning or Extension. 140af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// 141af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// This only works on builtin diagnostics, not custom ones, and is not 142af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// legal to call on NOTEs. 14333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis static bool isBuiltinWarningOrExtension(unsigned DiagID); 14433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 14576101cfe52d1b56974bf0e316247b3201f87c463Daniel Dunbar /// \brief Return true if the specified diagnostic is mapped to errors by 14676101cfe52d1b56974bf0e316247b3201f87c463Daniel Dunbar /// default. 14776101cfe52d1b56974bf0e316247b3201f87c463Daniel Dunbar static bool isDefaultMappingAsError(unsigned DiagID); 14876101cfe52d1b56974bf0e316247b3201f87c463Daniel Dunbar 149af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \brief Determine whether the given built-in diagnostic ID is a Note. 15033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis static bool isBuiltinNote(unsigned DiagID); 15133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 152af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \brief Determine whether the given built-in diagnostic ID is for an 153af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// extension of some sort. 15433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis static bool isBuiltinExtensionDiag(unsigned DiagID) { 15533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis bool ignored; 15633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis return isBuiltinExtensionDiag(DiagID, ignored); 15733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis } 15833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 159af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \brief Determine whether the given built-in diagnostic ID is for an 160af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// extension of some sort, and whether it is enabled by default. 161af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// 162af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// This also returns EnabledByDefault, which is set to indicate whether the 163af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// diagnostic is ignored by default (in which case -pedantic enables it) or 164af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// treated as a warning/error by default. 16533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// 16633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis static bool isBuiltinExtensionDiag(unsigned DiagID, bool &EnabledByDefault); 16733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 16833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 169af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \brief Return the lowest-level warning option that enables the specified 170af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// diagnostic. 171af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// 172af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// If there is no -Wfoo flag that controls the diagnostic, this returns null. 173686775deca8b8685eb90801495880e3abdd844c2Chris Lattner static StringRef getWarningOptionForDiag(unsigned DiagID); 174477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis 175af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \brief Return the category number that a specified \p DiagID belongs to, 176af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// or 0 if no category. 17733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis static unsigned getCategoryNumberForDiag(unsigned DiagID); 17833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 179af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \brief Return the number of diagnostic categories. 180477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis static unsigned getNumberOfCategories(); 181477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis 182af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \brief Given a category ID, return the name of the category. 183686775deca8b8685eb90801495880e3abdd844c2Chris Lattner static StringRef getCategoryNameFromID(unsigned CategoryID); 18433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 185af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \brief Return true if a given diagnostic falls into an ARC diagnostic 186af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// category. 187afdc21ad774eff6ed6c464e3f2dff9e26ed3d0b0Ted Kremenek static bool isARCDiagnostic(unsigned DiagID); 188afdc21ad774eff6ed6c464e3f2dff9e26ed3d0b0Ted Kremenek 189bed28ac1d1463adca3ecf24fca5c30646fa9dbb2Sylvestre Ledru /// \brief Enumeration describing how the emission of a diagnostic should 19033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// be treated when it occurs during C++ template argument deduction. 19133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis enum SFINAEResponse { 19233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// \brief The diagnostic should not be reported, but it should cause 19333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// template argument deduction to fail. 19433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// 19533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// The vast majority of errors that occur during template argument 19633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// deduction fall into this category. 19733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis SFINAE_SubstitutionFailure, 19833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 19933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// \brief The diagnostic should be suppressed entirely. 20033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// 20133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// Warnings generally fall into this category. 20233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis SFINAE_Suppress, 20333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 20433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// \brief The diagnostic should be reported. 20533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// 20633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// The diagnostic should be reported. Various fatal errors (e.g., 20733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// template instantiation depth exceeded) fall into this category. 208418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor SFINAE_Report, 209418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor 210418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor /// \brief The diagnostic is an access-control diagnostic, which will be 211418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor /// substitution failures in some contexts and reported in others. 212418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor SFINAE_AccessControl 21333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis }; 21433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 21533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// \brief Determines whether the given built-in diagnostic ID is 21633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// for an error that is suppressed if it occurs during C++ template 21733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// argument deduction. 21833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// 21933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// When an error is suppressed due to SFINAE, the template argument 22033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// deduction fails but no diagnostic is emitted. Certain classes of 22133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// errors, such as those errors that involve C++ access control, 22233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// are not SFINAE errors. 22333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis static SFINAEResponse getDiagnosticSFINAEResponse(unsigned DiagID); 22433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 2253f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar /// \brief Get the set of all diagnostic IDs in the group with the given name. 2263f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar /// 2273f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar /// \param Diags [out] - On return, the diagnostics in the group. 2283f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar /// \returns True if the given group is unknown, false otherwise. 2293f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar bool getDiagnosticsInGroup(StringRef Group, 230cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVectorImpl<diag::kind> &Diags) const; 23133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 23211583c757bac6ce5c342f2eb572055dd2619a657Argyrios Kyrtzidis /// \brief Get the set of all diagnostic IDs. 233cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko void getAllDiagnostics(SmallVectorImpl<diag::kind> &Diags) const; 23411583c757bac6ce5c342f2eb572055dd2619a657Argyrios Kyrtzidis 235a70cb9db9dd79ca9fc1febbb2f331004297664e0Benjamin Kramer /// \brief Get the warning option with the closest edit distance to the given 236a70cb9db9dd79ca9fc1febbb2f331004297664e0Benjamin Kramer /// group name. 237a70cb9db9dd79ca9fc1febbb2f331004297664e0Benjamin Kramer static StringRef getNearestWarningOption(StringRef Group); 238a70cb9db9dd79ca9fc1febbb2f331004297664e0Benjamin Kramer 239d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenekprivate: 2403f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar /// \brief Get the set of all diagnostic IDs in the given group. 2413f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar /// 2423f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar /// \param Diags [out] - On return, the diagnostics in the group. 2433f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar void getDiagnosticsInGroup(const WarningOption *Group, 244cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVectorImpl<diag::kind> &Diags) const; 2453f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar 246d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie /// \brief Based on the way the client configured the DiagnosticsEngine 24733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// object, classify the specified diagnostic ID into a Level, consumable by 24833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// the DiagnosticClient. 2490827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis /// 2500827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis /// \param Loc The source location we are interested in finding out the 2510827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis /// diagnostic state. Can be null in order to query the latest state. 2520827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis DiagnosticIDs::Level getDiagnosticLevel(unsigned DiagID, SourceLocation Loc, 2531656aaec223949245fdbebf306b719cba0b687caDaniel Dunbar const DiagnosticsEngine &Diag) const; 25433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 255af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \brief An internal implementation helper used when \p DiagClass is 256af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// already known. 25733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis DiagnosticIDs::Level getDiagnosticLevel(unsigned DiagID, 25833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis unsigned DiagClass, 2590827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis SourceLocation Loc, 2601656aaec223949245fdbebf306b719cba0b687caDaniel Dunbar const DiagnosticsEngine &Diag) const; 26133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 262af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \brief Used to report a diagnostic that is finally fully formed. 26333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// 264af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \returns \c true if the diagnostic was emitted, \c false if it was 26533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// suppressed. 266d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie bool ProcessDiag(DiagnosticsEngine &Diag) const; 26733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 268c6d64a26c28bbeee50e06c94c4f4c08e610327b7Jordan Rose /// \brief Used to emit a diagnostic that is finally fully formed, 269c6d64a26c28bbeee50e06c94c4f4c08e610327b7Jordan Rose /// ignoring suppression. 270c6d64a26c28bbeee50e06c94c4f4c08e610327b7Jordan Rose void EmitDiag(DiagnosticsEngine &Diag, Level DiagLevel) const; 271c6d64a26c28bbeee50e06c94c4f4c08e610327b7Jordan Rose 272add80bb3957dba1d9389304453c0a4c975768bd7John McCall /// \brief Whether the diagnostic may leave the AST in a state where some 273add80bb3957dba1d9389304453c0a4c975768bd7John McCall /// invariants can break. 274add80bb3957dba1d9389304453c0a4c975768bd7John McCall bool isUnrecoverable(unsigned DiagID) const; 275add80bb3957dba1d9389304453c0a4c975768bd7John McCall 276d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie friend class DiagnosticsEngine; 27733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis}; 27833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 27933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis} // end namespace clang 28033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 28133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#endif 282