Clang Project

clang_source_code/test/Sema/tautological-unsigned-enum-zero-compare.c
1// RUN: %clang_cc1 -triple=x86_64-pc-linux-gnu -fsyntax-only \
2// RUN:            -Wtautological-unsigned-enum-zero-compare \
3// RUN:            -verify=unsigned,unsigned-signed %s
4// RUN: %clang_cc1 -triple=x86_64-pc-win32 -fsyntax-only \
5// RUN:            -Wtautological-unsigned-enum-zero-compare \
6// RUN:            -verify=unsigned-signed %s
7// RUN: %clang_cc1 -triple=x86_64-pc-win32 -fsyntax-only \
8// RUN:            -verify=silence %s
9
10// Okay, this is where it gets complicated.
11// Then default enum sigdness is target-specific.
12// On windows, it is signed by default. We do not want to warn in that case.
13
14int main() {
15  enum A { A_a = 0 };
16  enum A a;
17  enum B { B_a = -1 };
18  enum B b;
19
20  // silence-no-diagnostics
21
22  if (a < 0) // unsigned-warning {{comparison of unsigned enum expression < 0 is always false}}
23    return 0;
24  if (0 >= a)
25    return 0;
26  if (a > 0)
27    return 0;
28  if (0 <= a) // unsigned-warning {{comparison of 0 <= unsigned enum expression is always true}}
29    return 0;
30  if (a <= 0)
31    return 0;
32  if (0 > a) // unsigned-warning {{comparison of 0 > unsigned enum expression is always false}}
33    return 0;
34  if (a >= 0) // unsigned-warning {{comparison of unsigned enum expression >= 0 is always true}}
35    return 0;
36  if (0 < a)
37    return 0;
38
39  if (a < 0U) // unsigned-signed-warning {{comparison of unsigned enum expression < 0 is always false}}
40    return 0;
41  if (0U >= a)
42    return 0;
43  if (a > 0U)
44    return 0;
45  if (0U <= a) // unsigned-signed-warning {{comparison of 0 <= unsigned enum expression is always true}}
46    return 0;
47  if (a <= 0U)
48    return 0;
49  if (0U > a) // unsigned-signed-warning {{comparison of 0 > unsigned enum expression is always false}}
50    return 0;
51  if (a >= 0U) // unsigned-signed-warning {{comparison of unsigned enum expression >= 0 is always true}}
52    return 0;
53  if (0U < a)
54    return 0;
55
56  if (b < 0)
57    return 0;
58  if (0 >= b)
59    return 0;
60  if (b > 0)
61    return 0;
62  if (0 <= b)
63    return 0;
64  if (b <= 0)
65    return 0;
66  if (0 > b)
67    return 0;
68  if (b >= 0)
69    return 0;
70  if (0 < b)
71    return 0;
72
73  if (b < 0U) // unsigned-signed-warning {{comparison of unsigned enum expression < 0 is always false}}
74    return 0;
75  if (0U >= b)
76    return 0;
77  if (b > 0U)
78    return 0;
79  if (0U <= b) // unsigned-signed-warning {{comparison of 0 <= unsigned enum expression is always true}}
80    return 0;
81  if (b <= 0U)
82    return 0;
83  if (0U > b) // unsigned-signed-warning {{comparison of 0 > unsigned enum expression is always false}}
84    return 0;
85  if (b >= 0U) // unsigned-signed-warning {{comparison of unsigned enum expression >= 0 is always true}}
86    return 0;
87  if (0U < b)
88    return 0;
89
90  if (a == 0)
91    return 0;
92  if (0 != a)
93    return 0;
94  if (a != 0)
95    return 0;
96  if (0 == a)
97    return 0;
98
99  if (a == 0U)
100    return 0;
101  if (0U != a)
102    return 0;
103  if (a != 0U)
104    return 0;
105  if (0U == a)
106    return 0;
107
108  if (b == 0)
109    return 0;
110  if (0 != b)
111    return 0;
112  if (b != 0)
113    return 0;
114  if (0 == b)
115    return 0;
116
117  if (b == 0U)
118    return 0;
119  if (0U != b)
120    return 0;
121  if (b != 0U)
122    return 0;
123  if (0U == b)
124    return 0;
125
126  return 1;
127}
128