1 | // RUN: %clang_cc1 -fsyntax-only -verify %s |
2 | |
3 | int foo(int x) { |
4 | return x == x; // expected-warning {{self-comparison always evaluates to true}} |
5 | } |
6 | |
7 | int foo2(int x) { |
8 | return (x) != (((x))); // expected-warning {{self-comparison always evaluates to false}} |
9 | } |
10 | |
11 | void foo3(short s, short t) { |
12 | if (s == s) {} // expected-warning {{self-comparison always evaluates to true}} |
13 | if (s == t) {} // no-warning |
14 | } |
15 | |
16 | void foo4(void* v, void* w) { |
17 | if (v == v) {} // expected-warning {{self-comparison always evaluates to true}} |
18 | if (v == w) {} // no-warning |
19 | } |
20 | |
21 | int qux(int x) { |
22 | return x < x; // expected-warning {{self-comparison}} |
23 | } |
24 | |
25 | int qux2(int x) { |
26 | return x > x; // expected-warning {{self-comparison}} |
27 | } |
28 | |
29 | int bar(float x) { |
30 | return x == x; // no-warning |
31 | } |
32 | |
33 | int bar2(float x) { |
34 | return x != x; // no-warning |
35 | } |
36 | |
37 | #define IS_THE_ANSWER(x) (x == 42) |
38 | |
39 | int macro_comparison() { |
40 | return IS_THE_ANSWER(42); |
41 | } |
42 | |
43 | // Don't complain in unevaluated contexts. |
44 | int compare_sizeof(int x) { |
45 | return sizeof(x == x); // no-warning |
46 | } |
47 | |
48 | int array_comparisons() { |
49 | int array1[2]; |
50 | int array2[2]; |
51 | |
52 | // |
53 | // compare same array |
54 | // |
55 | return array1 == array1; // expected-warning{{self-comparison always evaluates to true}} |
56 | return array1 != array1; // expected-warning{{self-comparison always evaluates to false}} |
57 | return array1 < array1; // expected-warning{{self-comparison always evaluates to false}} |
58 | return array1 <= array1; // expected-warning{{self-comparison always evaluates to true}} |
59 | return array1 > array1; // expected-warning{{self-comparison always evaluates to false}} |
60 | return array1 >= array1; // expected-warning{{self-comparison always evaluates to true}} |
61 | |
62 | // |
63 | // compare different arrays |
64 | // |
65 | return array1 == array2; // expected-warning{{array comparison always evaluates to false}} |
66 | return array1 != array2; // expected-warning{{array comparison always evaluates to true}} |
67 | |
68 | // |
69 | // we don't know what these are going to be |
70 | // |
71 | return array1 < array2; // expected-warning{{array comparison always evaluates to a constant}} |
72 | return array1 <= array2; // expected-warning{{array comparison always evaluates to a constant}} |
73 | return array1 > array2; // expected-warning{{array comparison always evaluates to a constant}} |
74 | return array1 >= array2; // expected-warning{{array comparison always evaluates to a constant}} |
75 | |
76 | } |
77 | |
78 | // Don't issue a warning when either the left or right side of the comparison |
79 | // results from a macro expansion. <rdar://problem/8435950> |
80 | #define R8435950_A i |
81 | #define R8435950_B i |
82 | |
83 | int R8435950(int i) { |
84 | if (R8435950_A == R8435950_B) // no-warning |
85 | return 0; |
86 | return 1; |
87 | } |
88 | |
89 | __attribute__((weak)) int weak_1[3]; |
90 | __attribute__((weak)) int weak_2[3]; |
91 | _Bool compare_weak() { |
92 | return weak_1 == weak_2; |
93 | } |
94 | |