• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // RUN: %clang_cc1 -fsyntax-only -verify -Wtautological-overlap-compare %s
2 
3 #define mydefine 2
4 
5 enum Choices {
6   CHOICE_0 = 0,
7   CHOICE_1 = 1
8 };
9 
10 enum Unchoices {
11   UNCHOICE_0 = 0,
12   UNCHOICE_1 = 1
13 };
14 
f(int x)15 void f(int x) {
16   int y = 0;
17 
18   // > || <
19   if (x > 2 || x < 1) { }
20   if (x > 2 || x < 2) { }
21   if (x != 2 || x != 3) { } // expected-warning {{overlapping comparisons always evaluate to true}}
22   if (x > 2 || x < 3) { } // expected-warning {{overlapping comparisons always evaluate to true}}
23   if (x > 0 || x < 0) { }
24 
25   if (x > 2 || x <= 1) { }
26   if (x > 2 || x <= 2) { } // expected-warning {{overlapping comparisons always evaluate to true}}
27   if (x > 2 || x <= 3) { } // expected-warning {{overlapping comparisons always evaluate to true}}
28 
29   if (x >= 2 || x < 1) { }
30   if (x >= 2 || x < 2) { } // expected-warning {{overlapping comparisons always evaluate to true}}
31   if (x >= 2 || x < 3) { } // expected-warning {{overlapping comparisons always evaluate to true}}
32 
33   if (x >= 2 || x <= 1) { } // expected-warning {{overlapping comparisons always evaluate to true}}
34   if (x >= 2 || x <= 2) { } // expected-warning {{overlapping comparisons always evaluate to true}}
35   if (x >= 2 || x <= 3) { } // expected-warning {{overlapping comparisons always evaluate to true}}
36   if (x >= 0 || x <= 0) { } // expected-warning {{overlapping comparisons always evaluate to true}}
37 
38   // > && <
39   if (x > 2 && x < 1) { }  // expected-warning {{overlapping comparisons always evaluate to false}}
40   if (x > 2 && x < 2) { }  // expected-warning {{overlapping comparisons always evaluate to false}}
41   if (x > 2 && x < 3) { }  // expected-warning {{overlapping comparisons always evaluate to false}}
42   if (x > 0 && x < 1) { }  // expected-warning {{overlapping comparisons always evaluate to false}}
43 
44   if (x > 2 && x <= 1) { }  // expected-warning {{overlapping comparisons always evaluate to false}}
45   if (x > 2 && x <= 2) { }  // expected-warning {{overlapping comparisons always evaluate to false}}
46   if (x > 2 && x <= 3) { }
47 
48   if (x >= 2 && x < 1) { }  // expected-warning {{overlapping comparisons always evaluate to false}}
49   if (x >= 2 && x < 2) { }  // expected-warning {{overlapping comparisons always evaluate to false}}
50   if (x >= 2 && x < 3) { }
51   if (x >= 0 && x < 0) { }  // expected-warning {{overlapping comparisons always evaluate to false}}
52 
53   if (x >= 2 && x <= 1) { }  // expected-warning {{overlapping comparisons always evaluate to false}}
54   if (x >= 2 && x <= 2) { }
55   if (x >= 2 && x <= 3) { }
56 
57   // !=, ==, ..
58   if (x != 2 || x != 3) { }  // expected-warning {{overlapping comparisons always evaluate to true}}
59   if (x != 2 || x < 3) { }   // expected-warning {{overlapping comparisons always evaluate to true}}
60   if (x == 2 && x == 3) { }  // expected-warning {{overlapping comparisons always evaluate to false}}
61   if (x == 2 && x > 3) { }   // expected-warning {{overlapping comparisons always evaluate to false}}
62   if (x == 3 && x < 0) { }  // expected-warning {{overlapping comparisons always evaluate to false}}
63   if (3 == x && x < 0) { }  // expected-warning {{overlapping comparisons always evaluate to false}}
64 
65   if (x == mydefine && x > 3) { }
66   if (x == (mydefine + 1) && x > 3) { }
67 
68   if (x != CHOICE_0 || x != CHOICE_1) { } // expected-warning {{overlapping comparisons always evaluate to true}}
69   if (x == CHOICE_0 && x == CHOICE_1) { } // expected-warning {{overlapping comparisons always evaluate to false}}
70 
71   // Don't warn if comparing x to different types
72   if (x == CHOICE_0 && x == 1) { }
73   if (x != CHOICE_0 || x != 1) { }
74 
75   // "Different types" includes different enums
76   if (x == CHOICE_0 && x == UNCHOICE_1) { }
77   if (x != CHOICE_0 || x != UNCHOICE_1) { }
78 }
79 
enums(enum Choices c)80 void enums(enum Choices c) {
81   if (c != CHOICE_0 || c != CHOICE_1) { } // expected-warning {{overlapping comparisons always evaluate to true}}
82   if (c == CHOICE_0 && c == CHOICE_1) { } // expected-warning {{overlapping comparisons always evaluate to false}}
83 
84   // Don't warn if comparing x to different types
85   if (c == CHOICE_0 && c == 1) { }
86   if (c != CHOICE_0 || c != 1) { }
87 
88   // "Different types" includes different enums
89   if (c == CHOICE_0 && c == UNCHOICE_1) { }
90   if (c != CHOICE_0 || c != UNCHOICE_1) { }
91 }
92 
93 // Don't generate a warning here.
array_out_of_bounds()94 void array_out_of_bounds() {
95   int x;
96   int buffer[4];
97   x = (-7 > 0) ? (buffer[-7]) : 0;
98 }
99