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