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 bit Deferrable = 0;
49}
50
51// Diagnostic Categories. These can be applied to groups or individual
52// diagnostics to specify a category.
53class DiagCategory<string Name> {
54 string CategoryName = Name;
55}
56
57// Diagnostic Groups.
58class DiagGroup<string Name, list<DiagGroup> subgroups = []> {
59 string GroupName = Name;
60 list<DiagGroup> SubGroups = subgroups;
61 string CategoryName = "";
62 code Documentation = [{}];
63}
64class InGroup<DiagGroup G> { DiagGroup Group = G; }
65//class IsGroup<string Name> { DiagGroup Group = DiagGroup<Name>; }
66
67// This defines documentation for diagnostic groups.
68include "DiagnosticDocs.td"
69
70// This defines all of the named diagnostic categories.
71include "DiagnosticCategories.td"
72
73// This defines all of the named diagnostic groups.
74include "DiagnosticGroups.td"
75
76
77// All diagnostics emitted by the compiler are an indirect subclass of this.
78class Diagnostic<string text, DiagClass DC, Severity defaultmapping> {
79 /// Component is specified by the file with a big let directive.
80 string Component = ?;
81 string Text = text;
82 DiagClass Class = DC;
83 SFINAEResponse SFINAE = SFINAE_Suppress;
84 bit AccessControl = 0;
85 bit WarningNoWerror = 0;
86 bit ShowInSystemHeader = 0;
87 bit Deferrable = 0;
88 Severity DefaultSeverity = defaultmapping;
89 DiagGroup Group;
90 string CategoryName = "";
91}
92
93class SFINAEFailure {
94 SFINAEResponse SFINAE = SFINAE_SubstitutionFailure;
95}
96class NoSFINAE {
97 SFINAEResponse SFINAE = SFINAE_Report;
98}
99class AccessControl {
100 SFINAEResponse SFINAE = SFINAE_AccessControl;
101}
102
103class ShowInSystemHeader {
104 bit ShowInSystemHeader = 1;
105}
106
107class SuppressInSystemHeader {
108 bit ShowInSystemHeader = 0;
109}
110
111class Deferrable {
112 bit Deferrable = 1;
113}
114
115class NonDeferrable {
116 bit Deferrable = 0;
117}
118
119// FIXME: ExtWarn and Extension should also be SFINAEFailure by default.
120class Error<string str> : Diagnostic<str, CLASS_ERROR, SEV_Error>, SFINAEFailure {
121 bit ShowInSystemHeader = 1;
122}
123// Warnings default to on (but can be default-off'd with DefaultIgnore).
124// This is used for warnings about questionable code; warnings about
125// accepted language extensions should use Extension or ExtWarn below instead.
126class Warning<string str> : Diagnostic<str, CLASS_WARNING, SEV_Warning>;
127// Remarks can be turned on with -R flags and provide commentary, e.g. on
128// optimizer decisions.
129class Remark<string str> : Diagnostic<str, CLASS_REMARK, SEV_Ignored>;
130// Extensions are warnings about accepted language extensions.
131// Extension warnings are default-off but enabled by -pedantic.
132class Extension<string str> : Diagnostic<str, CLASS_EXTENSION, SEV_Ignored>;
133// ExtWarns are warnings about accepted language extensions.
134// ExtWarn warnings are default-on.
135class ExtWarn<string str> : Diagnostic<str, CLASS_EXTENSION, SEV_Warning>;
136// Notes can provide supplementary information on errors, warnings, and remarks.
137class Note<string str> : Diagnostic<str, CLASS_NOTE, SEV_Fatal/*ignored*/>;
138
139
140class DefaultIgnore { Severity DefaultSeverity = SEV_Ignored; }
141class DefaultWarn { Severity DefaultSeverity = SEV_Warning; }
142class DefaultError { Severity DefaultSeverity = SEV_Error; }
143class DefaultFatal { Severity DefaultSeverity = SEV_Fatal; }
144class DefaultWarnNoWerror {
145 bit WarningNoWerror = 1;
146}
147class DefaultRemark { Severity DefaultSeverity = SEV_Remark; }
148
149// Definitions for Diagnostics.
150include "DiagnosticASTKinds.td"
151include "DiagnosticAnalysisKinds.td"
152include "DiagnosticCommentKinds.td"
153include "DiagnosticCommonKinds.td"
154include "DiagnosticCrossTUKinds.td"
155include "DiagnosticDriverKinds.td"
156include "DiagnosticFrontendKinds.td"
157include "DiagnosticLexKinds.td"
158include "DiagnosticParseKinds.td"
159include "DiagnosticRefactoringKinds.td"
160include "DiagnosticSemaKinds.td"
161include "DiagnosticSerializationKinds.td"
162
163