Skip to content

Commit 3a528ed

Browse files
committed
[clang][diagnostics] add '-Wundef-true' warning option
1 parent e5f5517 commit 3a528ed

File tree

3 files changed

+85
-1
lines changed

3 files changed

+85
-1
lines changed

clang/include/clang/Basic/DiagnosticLexKinds.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,9 @@ def pp_macro_not_used : Warning<"macro is not used">, DefaultIgnore,
393393
def warn_pp_undef_identifier : Warning<
394394
"%0 is not defined, evaluates to 0">,
395395
InGroup<DiagGroup<"undef">>, DefaultIgnore;
396+
def warn_pp_undef_true_identifier : Warning<
397+
"'true' is not defined, evaluates to 0">,
398+
InGroup<DiagGroup<"undef-true">>;
396399
def warn_pp_undef_prefix : Warning<
397400
"%0 is not defined, evaluates to 0">,
398401
InGroup<DiagGroup<"undef-prefix">>, DefaultIgnore;

clang/lib/Lex/PPExpressions.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,8 @@ static bool EvaluateValue(PPValue &Result, Token &PeekTok, DefinedTracker &DT,
260260
PP.Diag(PeekTok, diag::warn_pp_undef_identifier) << II;
261261

262262
const DiagnosticsEngine &DiagEngine = PP.getDiagnostics();
263-
// If 'Wundef' is enabled, do not emit 'undef-prefix' diagnostics.
263+
// If 'Wundef' is enabled, do not emit 'undef-prefix' or 'undef-true'
264+
// diagnostics.
264265
if (DiagEngine.isIgnored(diag::warn_pp_undef_identifier,
265266
PeekTok.getLocation())) {
266267
const std::vector<std::string> UndefPrefixes =
@@ -272,6 +273,8 @@ static bool EvaluateValue(PPValue &Result, Token &PeekTok, DefinedTracker &DT,
272273
}))
273274
PP.Diag(PeekTok, diag::warn_pp_undef_prefix)
274275
<< AddFlagValue{llvm::join(UndefPrefixes, ",")} << II;
276+
else if (II->getName() == "true")
277+
PP.Diag(PeekTok, diag::warn_pp_undef_true_identifier);
275278
}
276279
}
277280
Result.Val = 0;
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
// RUN: %clang_cc1 %s -Eonly -std=c89 -verify=undef-true -verify=undef
2+
// RUN: %clang_cc1 %s -Eonly -std=c99 -verify=undef-true -verify=undef
3+
// RUN: %clang_cc1 %s -Eonly -std=c11 -verify=undef-true -verify=undef
4+
// RUN: %clang_cc1 %s -Eonly -std=c17 -verify=undef-true -verify=undef
5+
// RUN: %clang_cc1 %s -Eonly -std=c23 -verify=undef-true -verify=undef
6+
7+
#if __STDC_VERSION__ >= 202311L
8+
/* undef-no-diagnostics */
9+
#endif
10+
11+
#define FOO true
12+
#if FOO /* #1 */
13+
#endif
14+
#if __STDC_VERSION__ < 202311L
15+
/* undef-true-warning@#1 {{'true' is not defined, evaluates to 0}} */
16+
#endif
17+
18+
#if true /* #2 */
19+
#endif
20+
#if __STDC_VERSION__ < 202311L
21+
/* undef-true-warning@#2 {{'true' is not defined, evaluates to 0}} */
22+
#endif
23+
24+
#if false || true /* #3 */
25+
#endif
26+
#if __STDC_VERSION__ < 202311L
27+
/* undef-true-warning@#3 {{'true' is not defined, evaluates to 0}} */
28+
#endif
29+
30+
#define true 1
31+
32+
#define FOO true
33+
#if FOO
34+
#endif
35+
36+
#if true
37+
#endif
38+
39+
#if false || true
40+
#endif
41+
42+
#undef true
43+
44+
#define FOO true
45+
#if FOO /* #4 */
46+
#endif
47+
#if __STDC_VERSION__ < 202311L
48+
/* undef-true-warning@#4 {{'true' is not defined, evaluates to 0}} */
49+
#endif
50+
51+
#if true /* #5 */
52+
#endif
53+
#if __STDC_VERSION__ < 202311L
54+
/* undef-true-warning@#5 {{'true' is not defined, evaluates to 0}} */
55+
#endif
56+
57+
#if false || true /* #6 */
58+
#endif
59+
#if __STDC_VERSION__ < 202311L
60+
/* undef-true-warning@#6 {{'true' is not defined, evaluates to 0}} */
61+
#endif
62+
63+
#define true true
64+
#if true /* #7 */
65+
#endif
66+
#if __STDC_VERSION__ < 202311L
67+
/* undef-true-warning@#7 {{'true' is not defined, evaluates to 0}} */
68+
#endif
69+
#undef true
70+
71+
/* Test that #pragma-enabled 'Wundef' can override 'Wundef-true' */
72+
#pragma clang diagnostic warning "-Wundef"
73+
#if true /* #8 */
74+
#endif
75+
#pragma clang diagnostic ignored "-Wundef"
76+
#if __STDC_VERSION__ < 202311L
77+
/* undef-warning@#8 {{'true' is not defined, evaluates to 0}} */
78+
#endif

0 commit comments

Comments
 (0)