1 /* PR c++/62153 */
2 /* { dg-do compile } */
3 /* { dg-options "-Wall" } */
4 
5 #ifndef __cplusplus
6 # define bool _Bool
7 # define true 1
8 # define false 0
9 #endif
10 
11 extern bool foo (void);
12 bool r;
13 
14 enum { E = 4 };
15 
16 void
fn1(bool b)17 fn1 (bool b)
18 {
19   r = b == 2; /* { dg-warning "with boolean expression is always false" } */
20   r = b != 2; /* { dg-warning "with boolean expression is always true" } */
21   r = b < 2; /* { dg-warning "with boolean expression is always true" } */
22   r = b > 2; /* { dg-warning "with boolean expression is always false" } */
23   r = b <= 2; /* { dg-warning "with boolean expression is always true" } */
24   r = b >= 2; /* { dg-warning "with boolean expression is always false" } */
25 
26   r = b == -1; /* { dg-warning "with boolean expression is always false" } */
27   r = b != -1; /* { dg-warning "with boolean expression is always true" } */
28   r = b < -1; /* { dg-warning "with boolean expression is always false" } */
29   r = b > -1; /* { dg-warning "with boolean expression is always true" } */
30   r = b <= -1; /* { dg-warning "with boolean expression is always false" } */
31   r = b >= -1; /* { dg-warning "with boolean expression is always true" } */
32 
33   r = foo () == 2; /* { dg-warning "with boolean expression is always false" } */
34   r = foo () != 2; /* { dg-warning "with boolean expression is always true" } */
35   r = foo () < 2; /* { dg-warning "with boolean expression is always true" } */
36   r = foo () > 2; /* { dg-warning "with boolean expression is always false" } */
37   r = foo () <= 2; /* { dg-warning "with boolean expression is always true" } */
38   r = foo () >= 2; /* { dg-warning "with boolean expression is always false" } */
39 
40   r = b == E; /* { dg-warning "with boolean expression is always false" } */
41   r = b != E; /* { dg-warning "with boolean expression is always true" } */
42   r = b < E; /* { dg-warning "with boolean expression is always true" } */
43   r = b > E; /* { dg-warning "with boolean expression is always false" } */
44   r = b <= E; /* { dg-warning "with boolean expression is always true" } */
45   r = b >= E; /* { dg-warning "with boolean expression is always false" } */
46 
47   /* Swap LHS and RHS.  */
48   r = 2 == b; /* { dg-warning "with boolean expression is always false" } */
49   r = 2 != b; /* { dg-warning "with boolean expression is always true" } */
50   r = 2 < b; /* { dg-warning "with boolean expression is always false" } */
51   r = 2 > b; /* { dg-warning "with boolean expression is always true" } */
52   r = 2 <= b; /* { dg-warning "with boolean expression is always false" } */
53   r = 2 >= b; /* { dg-warning "with boolean expression is always true" } */
54 
55   r = -1 == b; /* { dg-warning "with boolean expression is always false" } */
56   r = -1 != b; /* { dg-warning "with boolean expression is always true" } */
57   r = -1 < b; /* { dg-warning "with boolean expression is always true" } */
58   r = -1 > b; /* { dg-warning "with boolean expression is always false" } */
59   r = -1 <= b; /* { dg-warning "with boolean expression is always true" } */
60   r = -1 >= b; /* { dg-warning "with boolean expression is always false" } */
61 
62   r = E == b; /* { dg-warning "with boolean expression is always false" } */
63   r = E != b; /* { dg-warning "with boolean expression is always true" } */
64   r = E < b; /* { dg-warning "with boolean expression is always false" } */
65   r = E > b; /* { dg-warning "with boolean expression is always true" } */
66   r = E <= b; /* { dg-warning "with boolean expression is always false" } */
67   r = E >= b; /* { dg-warning "with boolean expression is always true" } */
68 
69   /* These are of course fine.  */
70   r = b == false;
71   r = b != false;
72   r = b == true;
73   r = b != true;
74 
75   r = b <= false;
76   r = b > false;
77   r = b < true;
78   r = b >= true;
79 }
80 
81 void
fn2(int i1,int i2)82 fn2 (int i1, int i2)
83 {
84   r = (i1 == i2) == 2; /* { dg-warning "with boolean expression is always false" } */
85   r = (i1 == i2) != 2; /* { dg-warning "with boolean expression is always true" } */
86   r = (i1 == i2) < 2; /* { dg-warning "with boolean expression is always true" } */
87   r = (i1 == i2) > 2; /* { dg-warning "with boolean expression is always false" } */
88   r = (i1 == i2) <= 2; /* { dg-warning "with boolean expression is always true" } */
89   r = (i1 == i2) >= 2; /* { dg-warning "with boolean expression is always false" } */
90 
91   r = (i1 == i2) == -1; /* { dg-warning "with boolean expression is always false" } */
92   r = (i1 == i2) != -1; /* { dg-warning "with boolean expression is always true" } */
93   r = (i1 == i2) < -1; /* { dg-warning "with boolean expression is always false" } */
94   r = (i1 == i2) > -1; /* { dg-warning "with boolean expression is always true" } */
95   r = (i1 == i2) <= -1; /* { dg-warning "with boolean expression is always false" } */
96   r = (i1 == i2) >= -1; /* { dg-warning "with boolean expression is always true" } */
97 
98   r = (i1 == i2) == E; /* { dg-warning "with boolean expression is always false" } */
99   r = (i1 == i2) != E; /* { dg-warning "with boolean expression is always true" } */
100   r = (i1 == i2) < E; /* { dg-warning "with boolean expression is always true" } */
101   r = (i1 == i2) > E; /* { dg-warning "with boolean expression is always false" } */
102   r = (i1 == i2) <= E; /* { dg-warning "with boolean expression is always true" } */
103   r = (i1 == i2) >= E; /* { dg-warning "with boolean expression is always false" } */
104 }
105 
106 void
fn3(int n,bool b)107 fn3 (int n, bool b)
108 {
109   /* Don't warn here.  */
110   r = b == n;
111   r = b != n;
112   r = b < n;
113   r = b > n;
114   r = b <= n;
115   r = b >= n;
116 
117   r = n == E;
118   r = n != E;
119   r = n < E;
120   r = n > E;
121   r = n <= E;
122   r = n >= E;
123 }
124