self-comparison.c revision f042dc6c65345b02bc7bbda6a57a4554c1135676
1cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenek// RUN: clang -fsyntax-only -verify %s
2cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenek
3cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenekint foo(int x) {
4cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenek  return x == x; // expected-warning {{self-comparison always results}}
5cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenek}
6cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenek
7cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenekint foo2(int x) {
8cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenek  return (x) != (((x))); // expected-warning {{self-comparison always results}}
9cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenek}
10cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenek
114926e10989b2877ed9558c0cff01816d18a6b9beTed Kremenekint qux(int x) {
124926e10989b2877ed9558c0cff01816d18a6b9beTed Kremenek   return x < x; // expected-warning {{self-comparison}}
134926e10989b2877ed9558c0cff01816d18a6b9beTed Kremenek}
144926e10989b2877ed9558c0cff01816d18a6b9beTed Kremenek
154926e10989b2877ed9558c0cff01816d18a6b9beTed Kremenekint qux2(int x) {
164926e10989b2877ed9558c0cff01816d18a6b9beTed Kremenek   return x > x; // expected-warning {{self-comparison}}
174926e10989b2877ed9558c0cff01816d18a6b9beTed Kremenek}
184926e10989b2877ed9558c0cff01816d18a6b9beTed Kremenek
19cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenekint bar(float x) {
20cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenek  return x == x; // no-warning
21cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenek}
22cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenek
23cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenekint bar2(float x) {
24cf8b77d47f0c9dde19da4de74e42f095a7cc2723Ted Kremenek  return x != x; // no-warning
254926e10989b2877ed9558c0cff01816d18a6b9beTed Kremenek}
26f042dc6c65345b02bc7bbda6a57a4554c1135676Ted Kremenek
27f042dc6c65345b02bc7bbda6a57a4554c1135676Ted Kremenek// Motivated by <rdar://problem/6703892>, self-comparisons of enum constants
28f042dc6c65345b02bc7bbda6a57a4554c1135676Ted Kremenek// should not be warned about.  These can be expanded from macros, and thus
29f042dc6c65345b02bc7bbda6a57a4554c1135676Ted Kremenek// are usually deliberate.
30f042dc6c65345b02bc7bbda6a57a4554c1135676Ted Kremenekint compare_enum() {
31f042dc6c65345b02bc7bbda6a57a4554c1135676Ted Kremenek  enum { A };
32f042dc6c65345b02bc7bbda6a57a4554c1135676Ted Kremenek  return A == A; // no-warning
33f042dc6c65345b02bc7bbda6a57a4554c1135676Ted Kremenek}
34