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 
main()14 int 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