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; 2533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 2633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis // Import the diagnostic enums themselves. 2733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis namespace diag { 2833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis // Start position for diagnostics. 2933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis enum { 30cfaa5525b8eea6c5f7767010e04e323f76bed1abDavid Majnemer DIAG_START_COMMON = 0, 31cfaa5525b8eea6c5f7767010e04e323f76bed1abDavid Majnemer DIAG_START_DRIVER = DIAG_START_COMMON + 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,\ 513347b497157d36cf280d1d9f52956faa6e702f34Richard Smith SFINAE,CATEGORY,NOWERROR,SHOWINSYSHEADER) ENUM, 52cfaa5525b8eea6c5f7767010e04e323f76bed1abDavid Majnemer#define COMMONSTART 5333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#include "clang/Basic/DiagnosticCommonKinds.inc" 5433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis NUM_BUILTIN_COMMON_DIAGNOSTICS 5533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#undef DIAG 5633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis }; 5733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 5833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// Enum values that allow the client to map NOTEs, WARNINGs, and EXTENSIONs 59ef8225444452a1486bd721f3285301fe84643b00Stephen Hines /// to either Ignore (nothing), Remark (emit a remark), Warning 60ef8225444452a1486bd721f3285301fe84643b00Stephen Hines /// (emit a warning) or Error (emit as an error). It allows clients to 61ef8225444452a1486bd721f3285301fe84643b00Stephen Hines /// map ERRORs to Error or Fatal (stop emitting diagnostics after this one). 62ef8225444452a1486bd721f3285301fe84643b00Stephen Hines enum class Severity { 6333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis // NOTE: 0 means "uncomputed". 64ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Ignored = 1, ///< Do not present this diagnostic, ignore it. 65ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Remark = 2, ///< Present this diagnostic as a remark. 66ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Warning = 3, ///< Present this diagnostic as a warning. 67ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Error = 4, ///< Present this diagnostic as an error. 68ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Fatal = 5 ///< Present this diagnostic as a fatal error. 6933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis }; 7033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis } 7133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 72ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesclass DiagnosticMapping { 73ef8225444452a1486bd721f3285301fe84643b00Stephen Hines unsigned Severity : 3; 74b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar unsigned IsUser : 1; 75b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar unsigned IsPragma : 1; 76a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar unsigned HasNoWarningAsError : 1; 77a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar unsigned HasNoErrorAsFatal : 1; 78b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar 79b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbarpublic: 80ef8225444452a1486bd721f3285301fe84643b00Stephen Hines static DiagnosticMapping Make(diag::Severity Severity, bool IsUser, 81ef8225444452a1486bd721f3285301fe84643b00Stephen Hines bool IsPragma) { 82ef8225444452a1486bd721f3285301fe84643b00Stephen Hines DiagnosticMapping Result; 83ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Result.Severity = (unsigned)Severity; 84b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar Result.IsUser = IsUser; 85b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar Result.IsPragma = IsPragma; 86a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar Result.HasNoWarningAsError = 0; 87a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar Result.HasNoErrorAsFatal = 0; 88b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar return Result; 89b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar } 90b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar 91ef8225444452a1486bd721f3285301fe84643b00Stephen Hines diag::Severity getSeverity() const { return (diag::Severity)Severity; } 92ef8225444452a1486bd721f3285301fe84643b00Stephen Hines void setSeverity(diag::Severity Value) { Severity = (unsigned)Value; } 93a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar 94b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar bool isUser() const { return IsUser; } 95b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar bool isPragma() const { return IsPragma; } 96b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar 97a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar bool hasNoWarningAsError() const { return HasNoWarningAsError; } 98a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar void setNoWarningAsError(bool Value) { HasNoWarningAsError = Value; } 99a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar 100a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar bool hasNoErrorAsFatal() const { return HasNoErrorAsFatal; } 101a5e41333b06fdf036d58495490eb14d6a0a3fcf7Daniel Dunbar void setNoErrorAsFatal(bool Value) { HasNoErrorAsFatal = Value; } 102b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar}; 103b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar 104a2405c6e5124126f2b59ba3313ebc14b56e5272dJames Dennett/// \brief Used for handling and querying diagnostic IDs. 105a2405c6e5124126f2b59ba3313ebc14b56e5272dJames Dennett/// 106a2405c6e5124126f2b59ba3313ebc14b56e5272dJames Dennett/// Can be used and shared by multiple Diagnostics for multiple translation units. 107c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmithclass DiagnosticIDs : public RefCountedBase<DiagnosticIDs> { 10833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidispublic: 109a2405c6e5124126f2b59ba3313ebc14b56e5272dJames Dennett /// \brief The level of the diagnostic, after it has been through mapping. 11033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis enum Level { 111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Ignored, Note, Remark, Warning, Error, Fatal 11233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis }; 11333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 11433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidisprivate: 115af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \brief 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 122651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// \brief Return an ID for a diagnostic with the specified format string and 123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// level. 124af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// 125fc09336a5965040736f9bc63a70416003972364eStefanus Du Toit /// If this is the first request for this diagnostic, it is registered and 126af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// created, otherwise the existing ID is returned. 127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: Replace this function with a create-only facilty like 129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // createCustomDiagIDFromFormatString() to enforce safe usage. At the time of 130651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // writing, nearly all callers of this function were invalid. 131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned getCustomDiagID(Level L, StringRef FormatString); 13233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 13333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis //===--------------------------------------------------------------------===// 13433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis // Diagnostic classification and reporting interfaces. 13533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis // 13633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 137af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \brief Given a diagnostic ID, return a description of the issue. 138686775deca8b8685eb90801495880e3abdd844c2Chris Lattner StringRef getDescription(unsigned DiagID) const; 13933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 140af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \brief Return true if the unmapped diagnostic levelof the specified 141af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// diagnostic ID is a Warning or Extension. 142af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// 143af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// This only works on builtin diagnostics, not custom ones, and is not 144af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// legal to call on NOTEs. 14533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis static bool isBuiltinWarningOrExtension(unsigned DiagID); 14633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 14776101cfe52d1b56974bf0e316247b3201f87c463Daniel Dunbar /// \brief Return true if the specified diagnostic is mapped to errors by 14876101cfe52d1b56974bf0e316247b3201f87c463Daniel Dunbar /// default. 14976101cfe52d1b56974bf0e316247b3201f87c463Daniel Dunbar static bool isDefaultMappingAsError(unsigned DiagID); 15076101cfe52d1b56974bf0e316247b3201f87c463Daniel Dunbar 151af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \brief Determine whether the given built-in diagnostic ID is a Note. 15233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis static bool isBuiltinNote(unsigned DiagID); 15333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 154af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \brief Determine whether the given built-in diagnostic ID is for an 155af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// extension of some sort. 15633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis static bool isBuiltinExtensionDiag(unsigned DiagID) { 15733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis bool ignored; 15833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis return isBuiltinExtensionDiag(DiagID, ignored); 15933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis } 16033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 161af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \brief Determine whether the given built-in diagnostic ID is for an 162af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// extension of some sort, and whether it is enabled by default. 163af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// 164af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// This also returns EnabledByDefault, which is set to indicate whether the 165af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// diagnostic is ignored by default (in which case -pedantic enables it) or 166af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// treated as a warning/error by default. 16733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// 16833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis static bool isBuiltinExtensionDiag(unsigned DiagID, bool &EnabledByDefault); 16933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 17033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 171af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \brief Return the lowest-level warning option that enables the specified 172af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// diagnostic. 173af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// 174af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// If there is no -Wfoo flag that controls the diagnostic, this returns null. 175686775deca8b8685eb90801495880e3abdd844c2Chris Lattner static StringRef getWarningOptionForDiag(unsigned DiagID); 176477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis 177af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \brief Return the category number that a specified \p DiagID belongs to, 178af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// or 0 if no category. 17933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis static unsigned getCategoryNumberForDiag(unsigned DiagID); 18033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 181af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \brief Return the number of diagnostic categories. 182477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis static unsigned getNumberOfCategories(); 183477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis 184af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \brief Given a category ID, return the name of the category. 185686775deca8b8685eb90801495880e3abdd844c2Chris Lattner static StringRef getCategoryNameFromID(unsigned CategoryID); 18633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 187af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \brief Return true if a given diagnostic falls into an ARC diagnostic 188af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// category. 189afdc21ad774eff6ed6c464e3f2dff9e26ed3d0b0Ted Kremenek static bool isARCDiagnostic(unsigned DiagID); 190afdc21ad774eff6ed6c464e3f2dff9e26ed3d0b0Ted Kremenek 191bed28ac1d1463adca3ecf24fca5c30646fa9dbb2Sylvestre Ledru /// \brief Enumeration describing how the emission of a diagnostic should 19233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// be treated when it occurs during C++ template argument deduction. 19333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis enum SFINAEResponse { 19433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// \brief The diagnostic should not be reported, but it should cause 19533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// template argument deduction to fail. 19633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// 19733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// The vast majority of errors that occur during template argument 19833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// deduction fall into this category. 19933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis SFINAE_SubstitutionFailure, 20033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 20133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// \brief The diagnostic should be suppressed entirely. 20233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// 20333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// Warnings generally fall into this category. 20433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis SFINAE_Suppress, 20533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 20633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// \brief The diagnostic should be reported. 20733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// 20833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// The diagnostic should be reported. Various fatal errors (e.g., 20933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// template instantiation depth exceeded) fall into this category. 210418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor SFINAE_Report, 211418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor 212418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor /// \brief The diagnostic is an access-control diagnostic, which will be 213418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor /// substitution failures in some contexts and reported in others. 214418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor SFINAE_AccessControl 21533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis }; 21633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 21733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// \brief Determines whether the given built-in diagnostic ID is 21833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// for an error that is suppressed if it occurs during C++ template 21933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// argument deduction. 22033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// 22133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// When an error is suppressed due to SFINAE, the template argument 22233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// deduction fails but no diagnostic is emitted. Certain classes of 22333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// errors, such as those errors that involve C++ access control, 22433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// are not SFINAE errors. 22533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis static SFINAEResponse getDiagnosticSFINAEResponse(unsigned DiagID); 22633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 2273f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar /// \brief Get the set of all diagnostic IDs in the group with the given name. 2283f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar /// 229a2405c6e5124126f2b59ba3313ebc14b56e5272dJames Dennett /// \param[out] Diags - On return, the diagnostics in the group. 230a2405c6e5124126f2b59ba3313ebc14b56e5272dJames Dennett /// \returns \c true if the given group is unknown, \c false otherwise. 2313f8394669673451061f57ced81f0a2cae087f119Daniel Dunbar bool getDiagnosticsInGroup(StringRef Group, 232cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVectorImpl<diag::kind> &Diags) const; 23333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 23411583c757bac6ce5c342f2eb572055dd2619a657Argyrios Kyrtzidis /// \brief Get the set of all diagnostic IDs. 235cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko void getAllDiagnostics(SmallVectorImpl<diag::kind> &Diags) const; 23611583c757bac6ce5c342f2eb572055dd2619a657Argyrios Kyrtzidis 237a70cb9db9dd79ca9fc1febbb2f331004297664e0Benjamin Kramer /// \brief Get the warning option with the closest edit distance to the given 238a70cb9db9dd79ca9fc1febbb2f331004297664e0Benjamin Kramer /// group name. 239a70cb9db9dd79ca9fc1febbb2f331004297664e0Benjamin Kramer static StringRef getNearestWarningOption(StringRef Group); 240a70cb9db9dd79ca9fc1febbb2f331004297664e0Benjamin Kramer 241d768150ef57f617c8d9fef48f3c92e8f21698024Ted Kremenekprivate: 242a2405c6e5124126f2b59ba3313ebc14b56e5272dJames Dennett /// \brief Classify the specified diagnostic ID into a Level, consumable by 24333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// the DiagnosticClient. 244a2405c6e5124126f2b59ba3313ebc14b56e5272dJames Dennett /// 245a2405c6e5124126f2b59ba3313ebc14b56e5272dJames Dennett /// The classification is based on the way the client configured the 246a2405c6e5124126f2b59ba3313ebc14b56e5272dJames Dennett /// DiagnosticsEngine object. 2470827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis /// 248a2405c6e5124126f2b59ba3313ebc14b56e5272dJames Dennett /// \param Loc The source location for which we are interested in finding out 249a2405c6e5124126f2b59ba3313ebc14b56e5272dJames Dennett /// the diagnostic state. Can be null in order to query the latest state. 250651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DiagnosticIDs::Level 251651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getDiagnosticLevel(unsigned DiagID, SourceLocation Loc, 252651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const DiagnosticsEngine &Diag) const LLVM_READONLY; 25333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 254ef8225444452a1486bd721f3285301fe84643b00Stephen Hines diag::Severity 255ef8225444452a1486bd721f3285301fe84643b00Stephen Hines getDiagnosticSeverity(unsigned DiagID, SourceLocation Loc, 256ef8225444452a1486bd721f3285301fe84643b00Stephen Hines const DiagnosticsEngine &Diag) const LLVM_READONLY; 25733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 258af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \brief Used to report a diagnostic that is finally fully formed. 25933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// 260af50aab0c317462129d73ae8000c6394c718598dJames Dennett /// \returns \c true if the diagnostic was emitted, \c false if it was 26133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis /// suppressed. 262d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie bool ProcessDiag(DiagnosticsEngine &Diag) const; 26333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 264c6d64a26c28bbeee50e06c94c4f4c08e610327b7Jordan Rose /// \brief Used to emit a diagnostic that is finally fully formed, 265c6d64a26c28bbeee50e06c94c4f4c08e610327b7Jordan Rose /// ignoring suppression. 266c6d64a26c28bbeee50e06c94c4f4c08e610327b7Jordan Rose void EmitDiag(DiagnosticsEngine &Diag, Level DiagLevel) const; 267c6d64a26c28bbeee50e06c94c4f4c08e610327b7Jordan Rose 268add80bb3957dba1d9389304453c0a4c975768bd7John McCall /// \brief Whether the diagnostic may leave the AST in a state where some 269add80bb3957dba1d9389304453c0a4c975768bd7John McCall /// invariants can break. 270add80bb3957dba1d9389304453c0a4c975768bd7John McCall bool isUnrecoverable(unsigned DiagID) const; 271add80bb3957dba1d9389304453c0a4c975768bd7John McCall 272d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie friend class DiagnosticsEngine; 27333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis}; 27433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 27533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis} // end namespace clang 27633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis 27733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#endif 278