DiagnosticIDs.h revision add80bb3957dba1d9389304453c0a4c975768bd7
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"
1933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
2033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidisnamespace clang {
2133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  class Diagnostic;
220827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  class SourceLocation;
2333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
2433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  // Import the diagnostic enums themselves.
2533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  namespace diag {
2633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    // Start position for diagnostics.
2733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    enum {
2833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      DIAG_START_DRIVER   =                        300,
2933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      DIAG_START_FRONTEND = DIAG_START_DRIVER   +  100,
30f84109ee6aeffb09366bd70c8593ce1b7818b1adFariborz Jahanian      DIAG_START_LEX      = DIAG_START_FRONTEND +  120,
3133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      DIAG_START_PARSE    = DIAG_START_LEX      +  300,
3233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      DIAG_START_AST      = DIAG_START_PARSE    +  300,
3333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      DIAG_START_SEMA     = DIAG_START_AST      +  100,
34d24eda8ad42bea6b36400d5505f67a7917d65652Chandler Carruth      DIAG_START_ANALYSIS = DIAG_START_SEMA     + 3000,
3533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      DIAG_UPPER_LIMIT    = DIAG_START_ANALYSIS +  100
3633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    };
3733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
3833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    class CustomDiagInfo;
3933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
4033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// diag::kind - All of the diagnostics that can be emitted by the frontend.
4133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    typedef unsigned kind;
4233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
4333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    // Get typedefs for common diagnostics.
4433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    enum {
457d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor#define DIAG(ENUM,FLAGS,DEFAULT_MAPPING,DESC,GROUP,\
467d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor             SFINAE,ACCESS,CATEGORY,BRIEF,FULL) ENUM,
4733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#include "clang/Basic/DiagnosticCommonKinds.inc"
4833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      NUM_BUILTIN_COMMON_DIAGNOSTICS
4933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#undef DIAG
5033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    };
5133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
5233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// Enum values that allow the client to map NOTEs, WARNINGs, and EXTENSIONs
5333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// to either MAP_IGNORE (nothing), MAP_WARNING (emit a warning), MAP_ERROR
5433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// (emit as an error).  It allows clients to map errors to
5533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// MAP_ERROR/MAP_DEFAULT or MAP_FATAL (stop emitting diagnostics after this
5633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// one).
5733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    enum Mapping {
5833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      // NOTE: 0 means "uncomputed".
5933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      MAP_IGNORE  = 1,     //< Map this diagnostic to nothing, ignore it.
6033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      MAP_WARNING = 2,     //< Map this diagnostic to a warning.
6133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      MAP_ERROR   = 3,     //< Map this diagnostic to an error.
6233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      MAP_FATAL   = 4,     //< Map this diagnostic to a fatal error.
6333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
6433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      /// Map this diagnostic to "warning", but make it immune to -Werror.  This
6533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      /// happens when you specify -Wno-error=foo.
6633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      MAP_WARNING_NO_WERROR = 5,
67144bc08f5fe6046bd8e07de5e41a4237dd2c6275Argyrios Kyrtzidis      /// Map this diagnostic to "warning", but make it immune to
68144bc08f5fe6046bd8e07de5e41a4237dd2c6275Argyrios Kyrtzidis      /// -Wno-system-headers.
69144bc08f5fe6046bd8e07de5e41a4237dd2c6275Argyrios Kyrtzidis      MAP_WARNING_SHOW_IN_SYSTEM_HEADER = 6,
7033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      /// Map this diagnostic to "error", but make it immune to -Wfatal-errors.
7133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      /// This happens for -Wno-fatal-errors=foo.
72144bc08f5fe6046bd8e07de5e41a4237dd2c6275Argyrios Kyrtzidis      MAP_ERROR_NO_WFATAL = 7
7333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    };
7433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  }
7533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
7633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis/// \brief Used for handling and querying diagnostic IDs. Can be used and shared
7733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis/// by multiple Diagnostics for multiple translation units.
7833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidisclass DiagnosticIDs : public llvm::RefCountedBase<DiagnosticIDs> {
7933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidispublic:
8033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// Level - The level of the diagnostic, after it has been through mapping.
8133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  enum Level {
8233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    Ignored, Note, Warning, Error, Fatal
8333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  };
8433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
8533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidisprivate:
8633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// CustomDiagInfo - Information for uniquing and looking up custom diags.
8733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  diag::CustomDiagInfo *CustomDiagInfo;
8833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
8933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidispublic:
9033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  DiagnosticIDs();
9133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  ~DiagnosticIDs();
9233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
9333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// getCustomDiagID - Return an ID for a diagnostic with the specified message
9433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// and level.  If this is the first request for this diagnosic, it is
9533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// registered and created, otherwise the existing ID is returned.
9633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  unsigned getCustomDiagID(Level L, llvm::StringRef Message);
9733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
9833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  //===--------------------------------------------------------------------===//
9933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  // Diagnostic classification and reporting interfaces.
10033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  //
10133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
10233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// getDescription - Given a diagnostic ID, return a description of the
10333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// issue.
104477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis  llvm::StringRef getDescription(unsigned DiagID) const;
10533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
1067d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor  /// isBuiltinWarningOrExtension - Return true if the unmapped diagnostic
10733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// level of the specified diagnostic ID is a Warning or Extension.
10833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// This only works on builtin diagnostics, not custom ones, and is not legal to
10933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// call on NOTEs.
11033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  static bool isBuiltinWarningOrExtension(unsigned DiagID);
11133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
11233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// \brief Determine whether the given built-in diagnostic ID is a
11333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// Note.
11433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  static bool isBuiltinNote(unsigned DiagID);
11533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
11633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// isBuiltinExtensionDiag - Determine whether the given built-in diagnostic
11733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// ID is for an extension of some sort.
11833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  ///
11933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  static bool isBuiltinExtensionDiag(unsigned DiagID) {
12033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    bool ignored;
12133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    return isBuiltinExtensionDiag(DiagID, ignored);
12233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  }
12333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
12433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// isBuiltinExtensionDiag - Determine whether the given built-in diagnostic
12533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// ID is for an extension of some sort.  This also returns EnabledByDefault,
12633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// which is set to indicate whether the diagnostic is ignored by default (in
12733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// which case -pedantic enables it) or treated as a warning/error by default.
12833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  ///
12933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  static bool isBuiltinExtensionDiag(unsigned DiagID, bool &EnabledByDefault);
13033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
13133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
13233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// getWarningOptionForDiag - Return the lowest-level warning option that
13333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// enables the specified diagnostic.  If there is no -Wfoo flag that controls
13433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// the diagnostic, this returns null.
135477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis  static llvm::StringRef getWarningOptionForDiag(unsigned DiagID);
136477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis
1377d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor  /// getCategoryNumberForDiag - Return the category number that a specified
13833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// DiagID belongs to, or 0 if no category.
13933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  static unsigned getCategoryNumberForDiag(unsigned DiagID);
14033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
141477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis  /// getNumberOfCategories - Return the number of categories
142477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis  static unsigned getNumberOfCategories();
143477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis
14433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// getCategoryNameFromID - Given a category ID, return the name of the
14533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// category.
146477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis  static llvm::StringRef getCategoryNameFromID(unsigned CategoryID);
14733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
14833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// \brief Enumeration describing how the the emission of a diagnostic should
14933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// be treated when it occurs during C++ template argument deduction.
15033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  enum SFINAEResponse {
15133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// \brief The diagnostic should not be reported, but it should cause
15233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// template argument deduction to fail.
15333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    ///
15433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// The vast majority of errors that occur during template argument
15533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// deduction fall into this category.
15633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    SFINAE_SubstitutionFailure,
15733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
15833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// \brief The diagnostic should be suppressed entirely.
15933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    ///
16033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// Warnings generally fall into this category.
16133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    SFINAE_Suppress,
16233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
16333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// \brief The diagnostic should be reported.
16433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    ///
16533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// The diagnostic should be reported. Various fatal errors (e.g.,
16633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// template instantiation depth exceeded) fall into this category.
167418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor    SFINAE_Report,
168418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor
169418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor    /// \brief The diagnostic is an access-control diagnostic, which will be
170418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor    /// substitution failures in some contexts and reported in others.
171418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor    SFINAE_AccessControl
17233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  };
17333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
17433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// \brief Determines whether the given built-in diagnostic ID is
17533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// for an error that is suppressed if it occurs during C++ template
17633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// argument deduction.
17733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  ///
17833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// When an error is suppressed due to SFINAE, the template argument
17933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// deduction fails but no diagnostic is emitted. Certain classes of
18033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// errors, such as those errors that involve C++ access control,
18133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// are not SFINAE errors.
18233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  static SFINAEResponse getDiagnosticSFINAEResponse(unsigned DiagID);
18333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
1847d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor  /// getName - Given a diagnostic ID, return its name
185477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis  static llvm::StringRef getName(unsigned DiagID);
1867d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor
1877d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor  /// getIdFromName - Given a diagnostic name, return its ID, or 0
188477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis  static unsigned getIdFromName(llvm::StringRef Name);
1897d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor
1907d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor  /// getBriefExplanation - Given a diagnostic ID, return a brief explanation
1917d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor  /// of the issue
192477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis  static llvm::StringRef getBriefExplanation(unsigned DiagID);
1937d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor
1947d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor  /// getFullExplanation - Given a diagnostic ID, return a full explanation
1957d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor  /// of the issue
196477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis  static llvm::StringRef getFullExplanation(unsigned DiagID);
1977d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor
19833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidisprivate:
19933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// setDiagnosticGroupMapping - Change an entire diagnostic group (e.g.
20033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// "unknown-pragmas" to have the specified mapping.  This returns true and
20133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// ignores the request if "Group" was unknown, false otherwise.
202477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis  bool setDiagnosticGroupMapping(llvm::StringRef Group, diag::Mapping Map,
2030827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis                                 SourceLocation Loc, Diagnostic &Diag) const;
20433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
2050827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  /// \brief Based on the way the client configured the Diagnostic
20633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// object, classify the specified diagnostic ID into a Level, consumable by
20733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// the DiagnosticClient.
2080827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  ///
2090827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  /// \param Loc The source location we are interested in finding out the
2100827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  /// diagnostic state. Can be null in order to query the latest state.
2110827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  DiagnosticIDs::Level getDiagnosticLevel(unsigned DiagID, SourceLocation Loc,
2127decebfc7b9dc841f228c93cc2e41e3e62911ff8Ted Kremenek                                          const Diagnostic &Diag,
2137decebfc7b9dc841f228c93cc2e41e3e62911ff8Ted Kremenek                                          diag::Mapping *mapping = 0) const;
21433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
21533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// getDiagnosticLevel - This is an internal implementation helper used when
21633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// DiagClass is already known.
21733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  DiagnosticIDs::Level getDiagnosticLevel(unsigned DiagID,
21833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis                                          unsigned DiagClass,
2190827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis                                          SourceLocation Loc,
2207decebfc7b9dc841f228c93cc2e41e3e62911ff8Ted Kremenek                                          const Diagnostic &Diag,
2217decebfc7b9dc841f228c93cc2e41e3e62911ff8Ted Kremenek                                          diag::Mapping *mapping = 0) const;
22233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
22333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// ProcessDiag - This is the method used to report a diagnostic that is
22433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// finally fully formed.
22533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  ///
22633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// \returns true if the diagnostic was emitted, false if it was
22733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// suppressed.
22833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  bool ProcessDiag(Diagnostic &Diag) const;
22933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
230add80bb3957dba1d9389304453c0a4c975768bd7John McCall  /// \brief Whether the diagnostic may leave the AST in a state where some
231add80bb3957dba1d9389304453c0a4c975768bd7John McCall  /// invariants can break.
232add80bb3957dba1d9389304453c0a4c975768bd7John McCall  bool isUnrecoverable(unsigned DiagID) const;
233add80bb3957dba1d9389304453c0a4c975768bd7John McCall
23433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  friend class Diagnostic;
23533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis};
23633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
23733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis}  // end namespace clang
23833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
23933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#endif
240