1 /* PR c/63357 */
2 /* { dg-do compile } */
3 /* { dg-options "-Wlogical-op" } */
4 
5 #ifndef __cplusplus
6 # define bool _Bool
7 # define true 1
8 # define false 0
9 #endif
10 
11 #if __SIZEOF_INT__ < 4
12   __extension__ typedef __INT32_TYPE__ int32_t;
13   __extension__ typedef __UINT32_TYPE__ uint32_t;
14   __extension__ typedef __INT16_TYPE__ int16_t;
15 #else
16   typedef int int32_t;
17   typedef unsigned int uint32_t;
18   typedef short int16_t;
19 #endif
20 
21 extern int32_t bar (void);
22 extern int32_t *p;
23 struct R { int32_t a, b; } S;
24 
25 void
andfn(int32_t a,int32_t b)26 andfn (int32_t a, int32_t b)
27 {
28   if (a && a) {}		/* { dg-warning "logical .and. of equal expressions" } */
29   if (!a && !a) {}		/* { dg-warning "logical .and. of equal expressions" } */
30   if (!!a && !!a) {}		/* { dg-warning "logical .and. of equal expressions" } */
31   if (a > 0 && a > 0) {}	/* { dg-warning "logical .and. of equal expressions" } */
32   if (a < 0 && a < 0) {}	/* { dg-warning "logical .and. of equal expressions" } */
33   if (a == 0 && a == 0) {}	/* { dg-warning "logical .and. of equal expressions" } */
34   if (a <= 0 && a <= 0) {}	/* { dg-warning "logical .and. of equal expressions" } */
35   if (a >= 0 && a >= 0) {}	/* { dg-warning "logical .and. of equal expressions" } */
36   if (a == 0 && !(a != 0)) {}	/* { dg-warning "logical .and. of equal expressions" } */
37 
38   if (a && a && a) {}		/* { dg-warning "logical .and. of equal expressions" } */
39   if ((a + 1) && (a + 1)) {}	/* { dg-warning "logical .and. of equal expressions" } */
40   if ((10 * a) && (a * 10)) {}	/* { dg-warning "logical .and. of equal expressions" } */
41   if (!!a && a) {}		/* { dg-warning "logical .and. of equal expressions" } */
42 
43   if (*p && *p) {}		/* { dg-warning "logical .and. of equal expressions" } */
44   if (p[0] && p[0]) {}		/* { dg-warning "logical .and. of equal expressions" } */
45   if (S.a && S.a) {}		/* { dg-warning "logical .and. of equal expressions" } */
46   if ((bool) a && (bool) a) {}	/* { dg-warning "logical .and. of equal expressions" } */
47   if ((uint32_t) a && a) {}	/* { dg-warning "logical .and. of equal expressions" } */
48 
49   /* Stay quiet here.  */
50   if (a && b) {}
51   if (!a && !b) {}
52   if (!!a && !!b) {}
53   if (a > 0 && b > 0) {}
54   if (a < 0 && b < 0) {}
55   if (a == 0 && b == 0) {}
56   if (a <= 0 && b <= 0) {}
57   if (a >= 0 && b >= 0) {}
58 
59   if (a > 0 && a > 1) {}
60   if (a > -2 && a > 1) {}
61   if (a && (int16_t) a) {}
62   if ((char) a && a) {}
63   if (++a && a) {}
64   if (++a && ++a) {}
65   if (a && --a) {}
66   if (a && a / 2) {}
67   if (bar () && bar ()) {}
68   if (p && *p) {}
69   if (p[0] && p[1]) {}
70   if (S.a && S.b) {}
71 }
72 
73 void
orfn(int32_t a,int32_t b)74 orfn (int32_t a, int32_t b)
75 {
76   if (a || a) {}		/* { dg-warning "logical .or. of equal expressions" } */
77   if (!a || !a) {}		/* { dg-warning "logical .or. of equal expressions" } */
78   if (!!a || !!a) {}		/* { dg-warning "logical .or. of equal expressions" } */
79   if (a > 0 || a > 0) {}	/* { dg-warning "logical .or. of equal expressions" } */
80   if (a < 0 || a < 0) {}	/* { dg-warning "logical .or. of equal expressions" } */
81   if (a == 0 || a == 0) {}	/* { dg-warning "logical .or. of equal expressions" } */
82   if (a <= 0 || a <= 0) {}	/* { dg-warning "logical .or. of equal expressions" } */
83   if (a >= 0 || a >= 0) {}	/* { dg-warning "logical .or. of equal expressions" } */
84   if (a == 0 || !(a != 0)) {}	/* { dg-warning "logical .or. of equal expressions" } */
85 
86   if (a || a || a) {}		/* { dg-warning "logical .or. of equal expressions" } */
87   if ((a + 1) || (a + 1)) {}	/* { dg-warning "logical .or. of equal expressions" } */
88   if ((10 * a) || (a * 10)) {}	/* { dg-warning "logical .or. of equal expressions" } */
89   if (!!a || a) {}		/* { dg-warning "logical .or. of equal expressions" } */
90 
91   if (*p || *p) {}		/* { dg-warning "logical .or. of equal expressions" } */
92   if (p[0] || p[0]) {}		/* { dg-warning "logical .or. of equal expressions" } */
93   if (S.a || S.a) {}		/* { dg-warning "logical .or. of equal expressions" } */
94   if ((bool) a || (bool) a) {}	/* { dg-warning "logical .or. of equal expressions" } */
95   if ((uint32_t) a || a) {}	/* { dg-warning "logical .or. of equal expressions" } */
96 
97   /* Stay quiet here.  */
98   if (a || b) {}
99   if (!a || !b) {}
100   if (!!a || !!b) {}
101   if (a > 0 || b > 0) {}
102   if (a < 0 || b < 0) {}
103   if (a == 0 || b == 0) {}
104   if (a <= 0 || b <= 0) {}
105   if (a >= 0 || b >= 0) {}
106 
107   if (a > 0 || a > 1) {}
108   if (a > -2 || a > 1) {}
109   if (a || (int16_t) a) {}
110   if ((char) a || a) {}
111   if (++a || a) {}
112   if (++a || ++a) {}
113   if (a || --a) {}
114   if (a || a / 2) {}
115   if (bar () || bar ()) {}
116   if (p || *p) {}
117   if (p[0] || p[1]) {}
118   if (S.a || S.b) {}
119 }
120