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