13573b2c84372d9484296fa658f5276f6c09acb92Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
2cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenek
3cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenekint foo(int x) {
45d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  return x == x; // expected-warning {{self-comparison always evaluates to true}}
5cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenek}
6cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenek
7cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenekint foo2(int x) {
85d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  return (x) != (((x))); // expected-warning {{self-comparison always evaluates to false}}
95d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor}
105d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor
115d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregorvoid foo3(short s, short t) {
125d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  if (s == s) {} // expected-warning {{self-comparison always evaluates to true}}
135d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  if (s == t) {} // no-warning
145d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor}
155d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor
165d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregorvoid foo4(void* v, void* w) {
175d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  if (v == v) {} // expected-warning {{self-comparison always evaluates to true}}
185d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  if (v == w) {} // no-warning
19cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenek}
20cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenek
214926e10989b2877ed9558c0cff01816d18a6b9beTed Kremenekint qux(int x) {
224926e10989b2877ed9558c0cff01816d18a6b9beTed Kremenek   return x < x; // expected-warning {{self-comparison}}
234926e10989b2877ed9558c0cff01816d18a6b9beTed Kremenek}
244926e10989b2877ed9558c0cff01816d18a6b9beTed Kremenek
254926e10989b2877ed9558c0cff01816d18a6b9beTed Kremenekint qux2(int x) {
264926e10989b2877ed9558c0cff01816d18a6b9beTed Kremenek   return x > x; // expected-warning {{self-comparison}}
274926e10989b2877ed9558c0cff01816d18a6b9beTed Kremenek}
284926e10989b2877ed9558c0cff01816d18a6b9beTed Kremenek
29cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenekint bar(float x) {
30cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenek  return x == x; // no-warning
31cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenek}
32cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenek
33cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenekint bar2(float x) {
34cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenek  return x != x; // no-warning
354926e10989b2877ed9558c0cff01816d18a6b9beTed Kremenek}
36f042dc6c65345b02bc7bbda6a57a4554c1135676Ted Kremenek
370737f2e65032a3715a9b10be1400d581bb96bd49Chandler Carruth#define IS_THE_ANSWER(x) (x == 42)
380737f2e65032a3715a9b10be1400d581bb96bd49Chandler Carruth
390737f2e65032a3715a9b10be1400d581bb96bd49Chandler Carruthint macro_comparison() {
400737f2e65032a3715a9b10be1400d581bb96bd49Chandler Carruth  return IS_THE_ANSWER(42);
41f042dc6c65345b02bc7bbda6a57a4554c1135676Ted Kremenek}
4203d4a759ca310279ed396418a3d6469dd1f06c3aDouglas Gregor
4303d4a759ca310279ed396418a3d6469dd1f06c3aDouglas Gregor// Don't complain in unevaluated contexts.
4403d4a759ca310279ed396418a3d6469dd1f06c3aDouglas Gregorint compare_sizeof(int x) {
4503d4a759ca310279ed396418a3d6469dd1f06c3aDouglas Gregor  return sizeof(x == x); // no-warning
4603d4a759ca310279ed396418a3d6469dd1f06c3aDouglas Gregor}
475d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor
485d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregorint array_comparisons() {
495d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  int array1[2];
505d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  int array2[2];
515d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor
525d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  //
535d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  // compare same array
545d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  //
555d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  return array1 == array1; // expected-warning{{self-comparison always evaluates to true}}
565d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  return array1 != array1; // expected-warning{{self-comparison always evaluates to false}}
575d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  return array1 < array1; // expected-warning{{self-comparison always evaluates to false}}
585d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  return array1 <= array1; // expected-warning{{self-comparison always evaluates to true}}
595d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  return array1 > array1; // expected-warning{{self-comparison always evaluates to false}}
605d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  return array1 >= array1; // expected-warning{{self-comparison always evaluates to true}}
615d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor
625d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  //
635d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  // compare differrent arrays
645d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  //
655d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  return array1 == array2; // expected-warning{{array comparison always evaluates to false}}
665d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  return array1 != array2; // expected-warning{{array comparison always evaluates to true}}
675d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor
685d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  //
695d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  // we don't know what these are going to be
705d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  //
715d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  return array1 < array2; // expected-warning{{array comparison always evaluates to a constant}}
725d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  return array1 <= array2; // expected-warning{{array comparison always evaluates to a constant}}
735d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  return array1 > array2; // expected-warning{{array comparison always evaluates to a constant}}
745d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor  return array1 >= array2; // expected-warning{{array comparison always evaluates to a constant}}
755d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor
765d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor}
775d8e67ed117c2e0a19acaa8d8f7c7dd900011b60Douglas Gregor
78657ca29cff71016e5300825ef539140b34fa535aTed Kremenek// Don't issue a warning when either the left or right side of the comparison
79657ca29cff71016e5300825ef539140b34fa535aTed Kremenek// results from a macro expansion.  <rdar://problem/8435950>
80657ca29cff71016e5300825ef539140b34fa535aTed Kremenek#define R8435950_A i
81657ca29cff71016e5300825ef539140b34fa535aTed Kremenek#define R8435950_B i
82657ca29cff71016e5300825ef539140b34fa535aTed Kremenek
83657ca29cff71016e5300825ef539140b34fa535aTed Kremenekint R8435950(int i) {
84657ca29cff71016e5300825ef539140b34fa535aTed Kremenek  if (R8435950_A == R8435950_B) // no-warning
85657ca29cff71016e5300825ef539140b34fa535aTed Kremenek   return 0;
86657ca29cff71016e5300825ef539140b34fa535aTed Kremenek  return 1;
87657ca29cff71016e5300825ef539140b34fa535aTed Kremenek}
88657ca29cff71016e5300825ef539140b34fa535aTed Kremenek
89