1//===--- Diagnostic.td - C Language Family Diagnostic Handling ------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9//  This file defines the TableGen core definitions for the diagnostics
10//  and diagnostic control.
11//
12//===----------------------------------------------------------------------===//
13
14// See the Internals Manual, section The Diagnostics Subsystem for an overview.
15
16// Define the diagnostic severities.
17class Severity<string N> {
18  string Name = N;
19}
20def SEV_Ignored : Severity<"Ignored">;
21def SEV_Remark  : Severity<"Remark">;
22def SEV_Warning : Severity<"Warning">;
23def SEV_Error   : Severity<"Error">;
24def SEV_Fatal   : Severity<"Fatal">;
25
26// Define the diagnostic classes.
27class DiagClass;
28def CLASS_NOTE      : DiagClass;
29def CLASS_REMARK    : DiagClass;
30def CLASS_WARNING   : DiagClass;
31def CLASS_EXTENSION : DiagClass;
32def CLASS_ERROR     : DiagClass;
33
34// Responses to a diagnostic in a SFINAE context.
35class SFINAEResponse;
36def SFINAE_SubstitutionFailure : SFINAEResponse;
37def SFINAE_Suppress            : SFINAEResponse;
38def SFINAE_Report              : SFINAEResponse;
39def SFINAE_AccessControl       : SFINAEResponse;
40
41// Textual substitutions which may be performed on the text of diagnostics
42class TextSubstitution<string Text> {
43  string Substitution = Text;
44  // TODO: These are only here to allow substitutions to be declared inline with
45  // diagnostics
46  string Component = "";
47  string CategoryName = "";
48}
49
50// Diagnostic Categories.  These can be applied to groups or individual
51// diagnostics to specify a category.
52class DiagCategory<string Name> {
53  string CategoryName = Name;
54}
55
56// Diagnostic Groups.
57class DiagGroup<string Name, list<DiagGroup> subgroups = []> {
58  string GroupName = Name;
59  list<DiagGroup> SubGroups = subgroups;
60  string CategoryName = "";
61  code Documentation = [{}];
62}
63class InGroup<DiagGroup G> { DiagGroup Group = G; }
64//class IsGroup<string Name> { DiagGroup Group = DiagGroup<Name>; }
65
66// This defines documentation for diagnostic groups.
67include "DiagnosticDocs.td"
68
69// This defines all of the named diagnostic categories.
70include "DiagnosticCategories.td"
71
72// This defines all of the named diagnostic groups.
73include "DiagnosticGroups.td"
74
75
76// All diagnostics emitted by the compiler are an indirect subclass of this.
77class Diagnostic<string text, DiagClass DC, Severity defaultmapping> {
78  /// Component is specified by the file with a big let directive.
79  string         Component = ?;
80  string         Text = text;
81  DiagClass      Class = DC;
82  SFINAEResponse SFINAE = SFINAE_Suppress;
83  bit            AccessControl = 0;
84  bit            WarningNoWerror = 0;
85  bit            ShowInSystemHeader = 0;
86  Severity       DefaultSeverity = defaultmapping;
87  DiagGroup      Group;
88  string         CategoryName = "";
89}
90
91class SFINAEFailure {
92  SFINAEResponse SFINAE = SFINAE_SubstitutionFailure;
93}
94class NoSFINAE {
95  SFINAEResponse SFINAE = SFINAE_Report;
96}
97class AccessControl {
98  SFINAEResponse SFINAE = SFINAE_AccessControl;
99}
100
101class ShowInSystemHeader {
102  bit ShowInSystemHeader = 1;
103}
104
105class SuppressInSystemHeader {
106  bit ShowInSystemHeader = 0;
107}
108
109// FIXME: ExtWarn and Extension should also be SFINAEFailure by default.
110class Error<string str>     : Diagnostic<str, CLASS_ERROR, SEV_Error>, SFINAEFailure {
111  bit ShowInSystemHeader = 1;
112}
113// Warnings default to on (but can be default-off'd with DefaultIgnore).
114// This is used for warnings about questionable code; warnings about
115// accepted language extensions should use Extension or ExtWarn below instead.
116class Warning<string str>   : Diagnostic<str, CLASS_WARNING, SEV_Warning>;
117// Remarks can be turned on with -R flags and provide commentary, e.g. on
118// optimizer decisions.
119class Remark<string str>    : Diagnostic<str, CLASS_REMARK, SEV_Ignored>;
120// Extensions are warnings about accepted language extensions.
121// Extension warnings are default-off but enabled by -pedantic.
122class Extension<string str> : Diagnostic<str, CLASS_EXTENSION, SEV_Ignored>;
123// ExtWarns are warnings about accepted language extensions.
124// ExtWarn warnings are default-on.
125class ExtWarn<string str>   : Diagnostic<str, CLASS_EXTENSION, SEV_Warning>;
126// Notes can provide supplementary information on errors, warnings, and remarks.
127class Note<string str>      : Diagnostic<str, CLASS_NOTE, SEV_Fatal/*ignored*/>;
128
129
130class DefaultIgnore { Severity DefaultSeverity = SEV_Ignored; }
131class DefaultWarn   { Severity DefaultSeverity = SEV_Warning; }
132class DefaultError  { Severity DefaultSeverity = SEV_Error; }
133class DefaultFatal  { Severity DefaultSeverity = SEV_Fatal; }
134class DefaultWarnNoWerror {
135  bit WarningNoWerror = 1;
136}
137class DefaultRemark { Severity DefaultSeverity = SEV_Remark; }
138
139// Definitions for Diagnostics.
140include "DiagnosticASTKinds.td"
141include "DiagnosticAnalysisKinds.td"
142include "DiagnosticCommentKinds.td"
143include "DiagnosticCommonKinds.td"
144include "DiagnosticCrossTUKinds.td"
145include "DiagnosticDriverKinds.td"
146include "DiagnosticFrontendKinds.td"
147include "DiagnosticLexKinds.td"
148include "DiagnosticParseKinds.td"
149include "DiagnosticRefactoringKinds.td"
150include "DiagnosticSemaKinds.td"
151include "DiagnosticSerializationKinds.td"
152
153