DiagnosticIDs.h revision b1c99c679adb53be8f478d08be83af6c9c22ae4b
133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis//===--- DiagnosticIDs.h - Diagnostic IDs Handling --------------*- C++ -*-===//
233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis//
333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis//                     The LLVM Compiler Infrastructure
433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis//
533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source
633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis// License. See LICENSE.TXT for details.
733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis//
833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis//
1033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis//  This file defines the Diagnostic IDs-related interfaces.
1133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis//
1233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
1333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
1433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#ifndef LLVM_CLANG_DIAGNOSTICIDS_H
1533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#define LLVM_CLANG_DIAGNOSTICIDS_H
1633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
1733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#include "llvm/ADT/IntrusiveRefCntPtr.h"
1833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#include "llvm/ADT/StringRef.h"
19686775deca8b8685eb90801495880e3abdd844c2Chris Lattner#include "clang/Basic/LLVM.h"
2033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
2133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidisnamespace clang {
22d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie  class DiagnosticsEngine;
230827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  class SourceLocation;
2433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
2533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  // Import the diagnostic enums themselves.
2633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  namespace diag {
2733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    // Start position for diagnostics.
2833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    enum {
2933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      DIAG_START_DRIVER   =                        300,
3033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      DIAG_START_FRONTEND = DIAG_START_DRIVER   +  100,
31f84109ee6aeffb09366bd70c8593ce1b7818b1adFariborz Jahanian      DIAG_START_LEX      = DIAG_START_FRONTEND +  120,
3233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      DIAG_START_PARSE    = DIAG_START_LEX      +  300,
3333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      DIAG_START_AST      = DIAG_START_PARSE    +  300,
3433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      DIAG_START_SEMA     = DIAG_START_AST      +  100,
35d24eda8ad42bea6b36400d5505f67a7917d65652Chandler Carruth      DIAG_START_ANALYSIS = DIAG_START_SEMA     + 3000,
3633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      DIAG_UPPER_LIMIT    = DIAG_START_ANALYSIS +  100
3733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    };
3833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
3933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    class CustomDiagInfo;
4033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
4133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// diag::kind - All of the diagnostics that can be emitted by the frontend.
4233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    typedef unsigned kind;
4333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
4433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    // Get typedefs for common diagnostics.
4533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    enum {
467d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor#define DIAG(ENUM,FLAGS,DEFAULT_MAPPING,DESC,GROUP,\
474213df3b5da21ce25a4541ca5c447eeb28b515a3Daniel Dunbar             SFINAE,ACCESS,CATEGORY,NOWERROR,SHOWINSYSHEADER,BRIEF,FULL) ENUM,
4833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#include "clang/Basic/DiagnosticCommonKinds.inc"
4933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      NUM_BUILTIN_COMMON_DIAGNOSTICS
5033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#undef DIAG
5133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    };
5233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
5333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// Enum values that allow the client to map NOTEs, WARNINGs, and EXTENSIONs
5433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// to either MAP_IGNORE (nothing), MAP_WARNING (emit a warning), MAP_ERROR
5533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// (emit as an error).  It allows clients to map errors to
5633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// MAP_ERROR/MAP_DEFAULT or MAP_FATAL (stop emitting diagnostics after this
5733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// one).
5833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    enum Mapping {
5933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      // NOTE: 0 means "uncomputed".
6033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      MAP_IGNORE  = 1,     //< Map this diagnostic to nothing, ignore it.
6133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      MAP_WARNING = 2,     //< Map this diagnostic to a warning.
6233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      MAP_ERROR   = 3,     //< Map this diagnostic to an error.
6333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      MAP_FATAL   = 4,     //< Map this diagnostic to a fatal error.
6433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
6533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      /// Map this diagnostic to "warning", but make it immune to -Werror.  This
6633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      /// happens when you specify -Wno-error=foo.
6733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      MAP_WARNING_NO_WERROR = 5,
68144bc08f5fe6046bd8e07de5e41a4237dd2c6275Argyrios Kyrtzidis      /// Map this diagnostic to "warning", but make it immune to
69144bc08f5fe6046bd8e07de5e41a4237dd2c6275Argyrios Kyrtzidis      /// -Wno-system-headers.
70144bc08f5fe6046bd8e07de5e41a4237dd2c6275Argyrios Kyrtzidis      MAP_WARNING_SHOW_IN_SYSTEM_HEADER = 6,
7133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      /// Map this diagnostic to "error", but make it immune to -Wfatal-errors.
7233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      /// This happens for -Wno-fatal-errors=foo.
73144bc08f5fe6046bd8e07de5e41a4237dd2c6275Argyrios Kyrtzidis      MAP_ERROR_NO_WFATAL = 7
7433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    };
7533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  }
7633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
77b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbarclass DiagnosticMappingInfo {
78b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar  unsigned Mapping : 3;
79b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar  unsigned IsUser : 1;
80b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar  unsigned IsPragma : 1;
81b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar
82b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbarpublic:
83b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar  static DiagnosticMappingInfo MakeUnset() {
84b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar    DiagnosticMappingInfo Result;
85b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar    Result.Mapping = Result.IsUser = Result.IsPragma = 0;
86b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar    return Result;
87b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar  }
88b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar
89b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar  static DiagnosticMappingInfo MakeInfo(diag::Mapping Mapping,
90b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar                                        bool IsUser, bool IsPragma) {
91b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar    DiagnosticMappingInfo Result;
92b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar    Result.Mapping = Mapping;
93b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar    Result.IsUser = IsUser;
94b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar    Result.IsPragma = IsPragma;
95b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar    return Result;
96b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar  }
97b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar
98b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar  diag::Mapping getMapping() const { return diag::Mapping(Mapping); }
99b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar  bool isUser() const { return IsUser; }
100b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar  bool isPragma() const { return IsPragma; }
101b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar
102b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar  bool isUnset() const { return Mapping == 0; }
103b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar};
104b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar
10533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis/// \brief Used for handling and querying diagnostic IDs. Can be used and shared
10633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis/// by multiple Diagnostics for multiple translation units.
10733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidisclass DiagnosticIDs : public llvm::RefCountedBase<DiagnosticIDs> {
10833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidispublic:
10933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// Level - The level of the diagnostic, after it has been through mapping.
11033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  enum Level {
11133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    Ignored, Note, Warning, Error, Fatal
11233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  };
11333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
11433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidisprivate:
11533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// CustomDiagInfo - 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
12233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// getCustomDiagID - Return an ID for a diagnostic with the specified message
12333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// and level.  If this is the first request for this diagnosic, it is
12433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// registered and created, otherwise the existing ID is returned.
125686775deca8b8685eb90801495880e3abdd844c2Chris Lattner  unsigned getCustomDiagID(Level L, StringRef Message);
12633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
12733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  //===--------------------------------------------------------------------===//
12833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  // Diagnostic classification and reporting interfaces.
12933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  //
13033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
13133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// getDescription - Given a diagnostic ID, return a description of the
13233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// issue.
133686775deca8b8685eb90801495880e3abdd844c2Chris Lattner  StringRef getDescription(unsigned DiagID) const;
13433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
13580d572d87e2a8258262fd9caa463ae9c046f7bf0Daniel Dunbar  /// isBuiltinWarningOrExtension - Return true if the unmapped diagnostic level
13680d572d87e2a8258262fd9caa463ae9c046f7bf0Daniel Dunbar  /// of the specified diagnostic ID is a Warning or Extension.  This only works
13780d572d87e2a8258262fd9caa463ae9c046f7bf0Daniel Dunbar  /// on builtin diagnostics, not custom ones, and is not legal to call on
13880d572d87e2a8258262fd9caa463ae9c046f7bf0Daniel Dunbar  /// NOTEs.
13933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  static bool isBuiltinWarningOrExtension(unsigned DiagID);
14033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
14176101cfe52d1b56974bf0e316247b3201f87c463Daniel Dunbar  /// \brief Return true if the specified diagnostic is mapped to errors by
14276101cfe52d1b56974bf0e316247b3201f87c463Daniel Dunbar  /// default.
14376101cfe52d1b56974bf0e316247b3201f87c463Daniel Dunbar  static bool isDefaultMappingAsError(unsigned DiagID);
14476101cfe52d1b56974bf0e316247b3201f87c463Daniel Dunbar
14533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// \brief Determine whether the given built-in diagnostic ID is a
14633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// Note.
14733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  static bool isBuiltinNote(unsigned DiagID);
14833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
14933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// isBuiltinExtensionDiag - Determine whether the given built-in diagnostic
15033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// ID is for an extension of some sort.
15133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  ///
15233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  static bool isBuiltinExtensionDiag(unsigned DiagID) {
15333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    bool ignored;
15433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    return isBuiltinExtensionDiag(DiagID, ignored);
15533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  }
15633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
15733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// isBuiltinExtensionDiag - Determine whether the given built-in diagnostic
15833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// ID is for an extension of some sort.  This also returns EnabledByDefault,
15933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// which is set to indicate whether the diagnostic is ignored by default (in
16033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// which case -pedantic enables it) or treated as a warning/error by default.
16133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  ///
16233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  static bool isBuiltinExtensionDiag(unsigned DiagID, bool &EnabledByDefault);
16333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
16433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
16533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// getWarningOptionForDiag - Return the lowest-level warning option that
16633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// enables the specified diagnostic.  If there is no -Wfoo flag that controls
16733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// the diagnostic, this returns null.
168686775deca8b8685eb90801495880e3abdd844c2Chris Lattner  static StringRef getWarningOptionForDiag(unsigned DiagID);
169477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis
1707d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor  /// getCategoryNumberForDiag - Return the category number that a specified
17133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// DiagID belongs to, or 0 if no category.
17233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  static unsigned getCategoryNumberForDiag(unsigned DiagID);
17333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
174477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis  /// getNumberOfCategories - Return the number of categories
175477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis  static unsigned getNumberOfCategories();
176477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis
17733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// getCategoryNameFromID - Given a category ID, return the name of the
17833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// category.
179686775deca8b8685eb90801495880e3abdd844c2Chris Lattner  static StringRef getCategoryNameFromID(unsigned CategoryID);
18033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
18133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// \brief Enumeration describing how the the emission of a diagnostic should
18233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// be treated when it occurs during C++ template argument deduction.
18333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  enum SFINAEResponse {
18433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// \brief The diagnostic should not be reported, but it should cause
18533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// template argument deduction to fail.
18633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    ///
18733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// The vast majority of errors that occur during template argument
18833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// deduction fall into this category.
18933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    SFINAE_SubstitutionFailure,
19033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
19133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// \brief The diagnostic should be suppressed entirely.
19233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    ///
19333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// Warnings generally fall into this category.
19433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    SFINAE_Suppress,
19533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
19633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// \brief The diagnostic should be reported.
19733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    ///
19833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// The diagnostic should be reported. Various fatal errors (e.g.,
19933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis    /// template instantiation depth exceeded) fall into this category.
200418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor    SFINAE_Report,
201418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor
202418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor    /// \brief The diagnostic is an access-control diagnostic, which will be
203418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor    /// substitution failures in some contexts and reported in others.
204418df343bb50802586d20aae3b83e2eb44c6c828Douglas Gregor    SFINAE_AccessControl
20533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  };
20633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
20733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// \brief Determines whether the given built-in diagnostic ID is
20833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// for an error that is suppressed if it occurs during C++ template
20933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// argument deduction.
21033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  ///
21133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// When an error is suppressed due to SFINAE, the template argument
21233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// deduction fails but no diagnostic is emitted. Certain classes of
21333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// errors, such as those errors that involve C++ access control,
21433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// are not SFINAE errors.
21533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  static SFINAEResponse getDiagnosticSFINAEResponse(unsigned DiagID);
21633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
2177d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor  /// getName - Given a diagnostic ID, return its name
218686775deca8b8685eb90801495880e3abdd844c2Chris Lattner  static StringRef getName(unsigned DiagID);
2197d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor
2207d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor  /// getIdFromName - Given a diagnostic name, return its ID, or 0
221686775deca8b8685eb90801495880e3abdd844c2Chris Lattner  static unsigned getIdFromName(StringRef Name);
2227d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor
2237d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor  /// getBriefExplanation - Given a diagnostic ID, return a brief explanation
2247d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor  /// of the issue
225686775deca8b8685eb90801495880e3abdd844c2Chris Lattner  static StringRef getBriefExplanation(unsigned DiagID);
2267d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor
2277d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor  /// getFullExplanation - Given a diagnostic ID, return a full explanation
2287d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor  /// of the issue
229686775deca8b8685eb90801495880e3abdd844c2Chris Lattner  static StringRef getFullExplanation(unsigned DiagID);
2306948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek
2316948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek  /// Iterator class used for traversing all statically declared
2326948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek  /// diagnostics.
2336948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek  class diag_iterator {
2346948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek    const void *impl;
2356948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek
2366948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek    friend class DiagnosticIDs;
237cb9657cfba92d5a3009e1b37109e03258c20d327Bill Wendling    diag_iterator(const void *im) : impl(im) {}
2386948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek  public:
2396948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek    diag_iterator &operator++();
2406948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek    bool operator==(const diag_iterator &x) const { return impl == x.impl; }
2416948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek    bool operator!=(const diag_iterator &x) const { return impl != x.impl; }
2426948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek
2436948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek    llvm::StringRef getDiagName() const;
2446948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek    unsigned getDiagID() const;
2456948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek  };
2466948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek
2476948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek  static diag_iterator diags_begin();
2486948bc4bcbd92502d90b877780a3b746275efa5bTed Kremenek  static diag_iterator diags_end();
2497d2b8c1fcc2b707be78b09930a7767477822462fDouglas Gregor
25033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidisprivate:
25133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// setDiagnosticGroupMapping - Change an entire diagnostic group (e.g.
25233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// "unknown-pragmas" to have the specified mapping.  This returns true and
25333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// ignores the request if "Group" was unknown, false otherwise.
254686775deca8b8685eb90801495880e3abdd844c2Chris Lattner  bool setDiagnosticGroupMapping(StringRef Group, diag::Mapping Map,
255d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie                                 SourceLocation Loc,
256d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie                                 DiagnosticsEngine &Diag) const;
25733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
258d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie  /// \brief Based on the way the client configured the DiagnosticsEngine
25933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// object, classify the specified diagnostic ID into a Level, consumable by
26033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// the DiagnosticClient.
2610827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  ///
2620827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  /// \param Loc The source location we are interested in finding out the
2630827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  /// diagnostic state. Can be null in order to query the latest state.
2640827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis  DiagnosticIDs::Level getDiagnosticLevel(unsigned DiagID, SourceLocation Loc,
2651656aaec223949245fdbebf306b719cba0b687caDaniel Dunbar                                          const DiagnosticsEngine &Diag) const;
26633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
26733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// getDiagnosticLevel - This is an internal implementation helper used when
26833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// DiagClass is already known.
26933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  DiagnosticIDs::Level getDiagnosticLevel(unsigned DiagID,
27033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis                                          unsigned DiagClass,
2710827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis                                          SourceLocation Loc,
2721656aaec223949245fdbebf306b719cba0b687caDaniel Dunbar                                          const DiagnosticsEngine &Diag) const;
27333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
27433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// ProcessDiag - This is the method used to report a diagnostic that is
27533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// finally fully formed.
27633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  ///
27733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// \returns true if the diagnostic was emitted, false if it was
27833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  /// suppressed.
279d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie  bool ProcessDiag(DiagnosticsEngine &Diag) const;
28033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
281add80bb3957dba1d9389304453c0a4c975768bd7John McCall  /// \brief Whether the diagnostic may leave the AST in a state where some
282add80bb3957dba1d9389304453c0a4c975768bd7John McCall  /// invariants can break.
283add80bb3957dba1d9389304453c0a4c975768bd7John McCall  bool isUnrecoverable(unsigned DiagID) const;
284add80bb3957dba1d9389304453c0a4c975768bd7John McCall
285d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie  friend class DiagnosticsEngine;
28633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis};
28733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
28833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis}  // end namespace clang
28933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis
29033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis#endif
291