Skip to content

Commit 10c6ebc

Browse files
authored
Reapply "[Clang] [NFC] Introduce a helper for emitting compatibility diagnostics (#132348)" (#134043)
This reapplies #132348 with a fix to the python bindings tests, reverting 076397f.
1 parent 41d718b commit 10c6ebc

32 files changed

+358
-95
lines changed

clang/bindings/python/tests/cindex/test_diagnostics.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ def test_diagnostic_category(self):
7979
self.assertEqual(d.location.line, 1)
8080
self.assertEqual(d.location.column, 11)
8181

82-
self.assertEqual(d.category_number, 2)
82+
self.assertEqual(d.category_number, 3)
8383
self.assertEqual(d.category_name, "Semantic Issue")
8484

8585
def test_diagnostic_option(self):
@@ -123,7 +123,7 @@ def test_diagnostic_string_format(self):
123123
self.assertEqual(str(d), "t.c:1:26: error: expected ';' after struct")
124124
self.assertEqual(
125125
d.format(0b111111),
126-
"t.c:1:26: error: expected ';' after struct [3, Parse Issue]",
126+
"t.c:1:26: error: expected ';' after struct [2, Parse Issue]",
127127
)
128128
with self.assertRaises(ValueError):
129129
d.format(0b1000000)

clang/include/clang/Basic/CMakeLists.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ macro(clang_diag_gen component)
88
-gen-clang-diags-enums -clang-component=${component}
99
SOURCE Diagnostic.td
1010
TARGET ClangDiagnostic${component}Enums)
11+
12+
clang_tablegen(Diagnostic${component}CompatIDs.inc
13+
-gen-clang-diags-compat-ids -clang-component=${component}
14+
SOURCE Diagnostic.td
15+
TARGET ClangDiagnostic${component}CompatIDs)
1116
endmacro(clang_diag_gen)
1217

1318
clang_diag_gen(Analysis)
@@ -31,6 +36,11 @@ clang_tablegen(DiagnosticIndexName.inc -gen-clang-diags-index-name
3136
SOURCE Diagnostic.td
3237
TARGET ClangDiagnosticIndexName)
3338

39+
clang_tablegen(DiagnosticAllCompatIDs.inc
40+
-gen-clang-diags-compat-ids
41+
SOURCE Diagnostic.td
42+
TARGET ClangDiagnosticAllCompatIDs)
43+
3444
clang_tablegen(AttrList.inc -gen-clang-attr-list
3545
-I ${CMAKE_CURRENT_SOURCE_DIR}/../../
3646
SOURCE Attr.td

clang/include/clang/Basic/Diagnostic.td

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,19 @@ class DefaultWarnNoWerror {
155155
}
156156
class DefaultRemark { Severity DefaultSeverity = SEV_Remark; }
157157

158+
class CompatWarningId<string name, int std, string diag, string diag_pre> {
159+
string Component = ?;
160+
string Name = name;
161+
string Diag = diag;
162+
string DiagPre = diag_pre;
163+
int Std = std;
164+
165+
// This is unused, but Tablegen will complain if it's missing because we define
166+
// the compatibility ids in the same place as the other diagnostics (which means
167+
// that we'll be inside a 'let CategoryName = "" in { ... }' block).
168+
string CategoryName = ?;
169+
}
170+
158171
// C++ compatibility warnings.
159172
multiclass CXXCompat<
160173
string message,
@@ -178,6 +191,11 @@ multiclass CXXCompat<
178191
"CXX98Compat",
179192
"CXXPre"#std_ver#"Compat"))>,
180193
DefaultIgnore;
194+
195+
def : CompatWarningId<
196+
NAME, std_ver,
197+
"compat_cxx"#std_ver#"_"#NAME,
198+
"compat_pre_cxx"#std_ver#"_"#NAME>;
181199
}
182200

183201
// These generate pairs of C++ compatibility warnings of the form:

clang/include/clang/Basic/DiagnosticAST.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,18 @@ enum {
3636
#undef DIAG_ENUM_ITEM
3737
#undef DIAG_ENUM
3838
} // end namespace diag
39+
40+
namespace diag_compat {
41+
#define DIAG_COMPAT_IDS_BEGIN() enum {
42+
#define DIAG_COMPAT_IDS_END() \
43+
} \
44+
;
45+
#define DIAG_COMPAT_ID(IDX, NAME, ...) NAME = IDX,
46+
#include "clang/Basic/DiagnosticASTCompatIDs.inc"
47+
#undef DIAG_COMPAT_ID
48+
#undef DIAG_COMPAT_IDS_BEGIN
49+
#undef DIAG_COMPAT_IDS_END
50+
} // end namespace diag_compat
3951
} // end namespace clang
4052

4153
#endif // LLVM_CLANG_BASIC_DIAGNOSTICAST_H

clang/include/clang/Basic/DiagnosticAnalysis.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,18 @@ enum {
3535
#undef DIAG_ENUM_ITEM
3636
#undef DIAG_ENUM
3737
} // end namespace diag
38+
39+
namespace diag_compat {
40+
#define DIAG_COMPAT_IDS_BEGIN() enum {
41+
#define DIAG_COMPAT_IDS_END() \
42+
} \
43+
;
44+
#define DIAG_COMPAT_ID(IDX, NAME, ...) NAME = IDX,
45+
#include "clang/Basic/DiagnosticAnalysisCompatIDs.inc"
46+
#undef DIAG_COMPAT_ID
47+
#undef DIAG_COMPAT_IDS_BEGIN
48+
#undef DIAG_COMPAT_IDS_END
49+
} // end namespace diag_compat
3850
} // end namespace clang
3951

4052
#endif // LLVM_CLANG_BASIC_DIAGNOSTICANALYSIS_H

clang/include/clang/Basic/DiagnosticComment.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,18 @@ enum {
3636
#undef DIAG_ENUM_ITEM
3737
#undef DIAG_ENUM
3838
} // end namespace diag
39+
40+
namespace diag_compat {
41+
#define DIAG_COMPAT_IDS_BEGIN() enum {
42+
#define DIAG_COMPAT_IDS_END() \
43+
} \
44+
;
45+
#define DIAG_COMPAT_ID(IDX, NAME, ...) NAME = IDX,
46+
#include "clang/Basic/DiagnosticCommentCompatIDs.inc"
47+
#undef DIAG_COMPAT_ID
48+
#undef DIAG_COMPAT_IDS_BEGIN
49+
#undef DIAG_COMPAT_IDS_END
50+
} // end namespace diag_compat
3951
} // end namespace clang
4052

4153
#endif // LLVM_CLANG_BASIC_DIAGNOSTICCOMMENT_H

clang/include/clang/Basic/DiagnosticCrossTU.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,18 @@ enum {
3636
#undef DIAG_ENUM_ITEM
3737
#undef DIAG_ENUM
3838
} // end namespace diag
39+
40+
namespace diag_compat {
41+
#define DIAG_COMPAT_IDS_BEGIN() enum {
42+
#define DIAG_COMPAT_IDS_END() \
43+
} \
44+
;
45+
#define DIAG_COMPAT_ID(IDX, NAME, ...) NAME = IDX,
46+
#include "clang/Basic/DiagnosticCrossTUCompatIDs.inc"
47+
#undef DIAG_COMPAT_ID
48+
#undef DIAG_COMPAT_IDS_BEGIN
49+
#undef DIAG_COMPAT_IDS_END
50+
} // end namespace diag_compat
3951
} // end namespace clang
4052

4153
#endif // LLVM_CLANG_BASIC_DIAGNOSTICCROSSTU_H

clang/include/clang/Basic/DiagnosticDriver.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,18 @@ enum {
3636
#undef DIAG_ENUM_ITEM
3737
#undef DIAG_ENUM
3838
} // end namespace diag
39+
40+
namespace diag_compat {
41+
#define DIAG_COMPAT_IDS_BEGIN() enum {
42+
#define DIAG_COMPAT_IDS_END() \
43+
} \
44+
;
45+
#define DIAG_COMPAT_ID(IDX, NAME, ...) NAME = IDX,
46+
#include "clang/Basic/DiagnosticDriverCompatIDs.inc"
47+
#undef DIAG_COMPAT_ID
48+
#undef DIAG_COMPAT_IDS_BEGIN
49+
#undef DIAG_COMPAT_IDS_END
50+
} // end namespace diag_compat
3951
} // end namespace clang
4052

4153
#endif // LLVM_CLANG_BASIC_DIAGNOSTICDRIVER_H

clang/include/clang/Basic/DiagnosticFrontend.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,18 @@ enum {
3636
#undef DIAG_ENUM_ITEM
3737
#undef DIAG_ENUM
3838
} // end namespace diag
39+
40+
namespace diag_compat {
41+
#define DIAG_COMPAT_IDS_BEGIN() enum {
42+
#define DIAG_COMPAT_IDS_END() \
43+
} \
44+
;
45+
#define DIAG_COMPAT_ID(IDX, NAME, ...) NAME = IDX,
46+
#include "clang/Basic/DiagnosticFrontendCompatIDs.inc"
47+
#undef DIAG_COMPAT_ID
48+
#undef DIAG_COMPAT_IDS_BEGIN
49+
#undef DIAG_COMPAT_IDS_END
50+
} // end namespace diag_compat
3951
} // end namespace clang
4052

4153
#endif // LLVM_CLANG_BASIC_DIAGNOSTICFRONTEND_H

clang/include/clang/Basic/DiagnosticIDs.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
namespace clang {
2626
class DiagnosticsEngine;
2727
class DiagnosticBuilder;
28+
class LangOptions;
2829
class SourceLocation;
2930

3031
// Import the diagnostic enums themselves.
@@ -104,6 +105,18 @@ namespace clang {
104105
};
105106
}
106107

108+
namespace diag_compat {
109+
#define DIAG_COMPAT_IDS_BEGIN() enum {
110+
#define DIAG_COMPAT_IDS_END() \
111+
} \
112+
;
113+
#define DIAG_COMPAT_ID(IDX, NAME, ...) NAME = IDX,
114+
#include "clang/Basic/DiagnosticCommonCompatIDs.inc"
115+
#undef DIAG_COMPAT_ID
116+
#undef DIAG_COMPAT_IDS_BEGIN
117+
#undef DIAG_COMPAT_IDS_END
118+
} // end namespace diag_compat
119+
107120
class DiagnosticMapping {
108121
LLVM_PREFERRED_TYPE(diag::Severity)
109122
unsigned Severity : 3;
@@ -464,6 +477,11 @@ class DiagnosticIDs : public RefCountedBase<DiagnosticIDs> {
464477
/// given group name.
465478
static StringRef getNearestOption(diag::Flavor Flavor, StringRef Group);
466479

480+
/// Get the appropriate diagnostic Id to use for issuing a compatibility
481+
/// diagnostic. For use by the various DiagCompat() helpers.
482+
static unsigned getCXXCompatDiagId(const LangOptions &LangOpts,
483+
unsigned CompatDiagId);
484+
467485
private:
468486
/// Classify the specified diagnostic ID into a Level, consumable by
469487
/// the DiagnosticClient.

0 commit comments

Comments
 (0)