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