1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s 2*67e74705SXin Li foo(int x)3*67e74705SXin Liint 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 Liint 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 Livoid 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 Livoid 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 Liint qux(int x) { 22*67e74705SXin Li return x < x; // expected-warning {{self-comparison}} 23*67e74705SXin Li } 24*67e74705SXin Li qux2(int x)25*67e74705SXin Liint qux2(int x) { 26*67e74705SXin Li return x > x; // expected-warning {{self-comparison}} 27*67e74705SXin Li } 28*67e74705SXin Li bar(float x)29*67e74705SXin Liint bar(float x) { 30*67e74705SXin Li return x == x; // no-warning 31*67e74705SXin Li } 32*67e74705SXin Li bar2(float x)33*67e74705SXin Liint 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 Liint 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 Liint compare_sizeof(int x) { 45*67e74705SXin Li return sizeof(x == x); // no-warning 46*67e74705SXin Li } 47*67e74705SXin Li array_comparisons()48*67e74705SXin Liint 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 Liint 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