1f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor// RUN: %clang_cc1 -fsyntax-only -fcxx-exceptions -verify -Wno-unused -Wunused-comparison %s
2ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth
3ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruthstruct A {
4ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth  bool operator==(const A&);
5ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth  bool operator!=(const A&);
6651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool operator<(const A&);
7651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool operator>(const A&);
8651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool operator<=(const A&);
9651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool operator>=(const A&);
10ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth  A operator|=(const A&);
11ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth  operator bool();
12ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth};
13ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth
14ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruthvoid test() {
15ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth  int x, *p;
16ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth  A a, b;
17ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth
18ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth  x == 7; // expected-warning {{equality comparison result unused}} \
19ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth          // expected-note {{use '=' to turn this equality comparison into an assignment}}
20ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth  x != 7; // expected-warning {{inequality comparison result unused}} \
21ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth          // expected-note {{use '|=' to turn this inequality comparison into an or-assignment}}
22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  x < 7;  // expected-warning {{relational comparison result unused}}
23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  x > 7;  // expected-warning {{relational comparison result unused}}
24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  x <= 7; // expected-warning {{relational comparison result unused}}
25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  x >= 7; // expected-warning {{relational comparison result unused}}
26651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
27ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth  7 == x; // expected-warning {{equality comparison result unused}}
28ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth  p == p; // expected-warning {{equality comparison result unused}} \
29ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth          // expected-note {{use '=' to turn this equality comparison into an assignment}} \
30ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth          // expected-warning {{self-comparison always evaluates to true}}
319b10683a3f222d8dc6e139073ca96b97b439747bChandler Carruth  a == a; // expected-warning {{equality comparison result unused}} \
329b10683a3f222d8dc6e139073ca96b97b439747bChandler Carruth          // expected-note {{use '=' to turn this equality comparison into an assignment}}
339b10683a3f222d8dc6e139073ca96b97b439747bChandler Carruth  a == b; // expected-warning {{equality comparison result unused}} \
349b10683a3f222d8dc6e139073ca96b97b439747bChandler Carruth          // expected-note {{use '=' to turn this equality comparison into an assignment}}
359b10683a3f222d8dc6e139073ca96b97b439747bChandler Carruth  a != b; // expected-warning {{inequality comparison result unused}} \
369b10683a3f222d8dc6e139073ca96b97b439747bChandler Carruth          // expected-note {{use '|=' to turn this inequality comparison into an or-assignment}}
37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  a < b;  // expected-warning {{relational comparison result unused}}
38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  a > b;  // expected-warning {{relational comparison result unused}}
39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  a <= b; // expected-warning {{relational comparison result unused}}
40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  a >= b; // expected-warning {{relational comparison result unused}}
41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
429b10683a3f222d8dc6e139073ca96b97b439747bChandler Carruth  A() == b; // expected-warning {{equality comparison result unused}}
43ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth  if (42) x == 7; // expected-warning {{equality comparison result unused}} \
44ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth                  // expected-note {{use '=' to turn this equality comparison into an assignment}}
45ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth  else if (42) x == 7; // expected-warning {{equality comparison result unused}} \
46ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth                       // expected-note {{use '=' to turn this equality comparison into an assignment}}
47ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth  else x == 7; // expected-warning {{equality comparison result unused}} \
48ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth               // expected-note {{use '=' to turn this equality comparison into an assignment}}
49ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth  do x == 7; // expected-warning {{equality comparison result unused}} \
50ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth             // expected-note {{use '=' to turn this equality comparison into an assignment}}
51ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth  while (false);
52ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth  while (false) x == 7; // expected-warning {{equality comparison result unused}} \
53ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth                        // expected-note {{use '=' to turn this equality comparison into an assignment}}
54ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth  for (x == 7; // expected-warning {{equality comparison result unused}} \
55ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth               // expected-note {{use '=' to turn this equality comparison into an assignment}}
56ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth       x == 7; // No warning -- result is used
57ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth       x == 7) // expected-warning {{equality comparison result unused}} \
58ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth               // expected-note {{use '=' to turn this equality comparison into an assignment}}
59ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth    x == 7; // expected-warning {{equality comparison result unused}} \
60ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth            // expected-note {{use '=' to turn this equality comparison into an assignment}}
615440bfaff6aec058b60bc6da75bb4f13b7a76491Chandler Carruth  switch (42) default: x == 7; // expected-warning {{equality comparison result unused}} \
625440bfaff6aec058b60bc6da75bb4f13b7a76491Chandler Carruth                               // expected-note {{use '=' to turn this equality comparison into an assignment}}
635440bfaff6aec058b60bc6da75bb4f13b7a76491Chandler Carruth  switch (42) case 42: x == 7; // expected-warning {{equality comparison result unused}} \
645440bfaff6aec058b60bc6da75bb4f13b7a76491Chandler Carruth                               // expected-note {{use '=' to turn this equality comparison into an assignment}}
65ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth  switch (42) {
66ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth    case 1:
67ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth    case 2:
68ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth    default:
69ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth    case 3:
70ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth    case 4:
715440bfaff6aec058b60bc6da75bb4f13b7a76491Chandler Carruth      x == 7; // expected-warning {{equality comparison result unused}} \
725440bfaff6aec058b60bc6da75bb4f13b7a76491Chandler Carruth              // expected-note {{use '=' to turn this equality comparison into an assignment}}
73ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth  }
74ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth
75ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth  (void)(x == 7);
76ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth  (void)(p == p); // expected-warning {{self-comparison always evaluates to true}}
77ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth  { bool b = x == 7; }
78ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth
79ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth  { bool b = ({ x == 7; // expected-warning {{equality comparison result unused}} \
80ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth                        // expected-note {{use '=' to turn this equality comparison into an assignment}}
81ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth                x == 7; }); } // no warning on the second, its result is used!
82ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth
83ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth#define EQ(x,y) (x) == (y)
84ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth  EQ(x, 5);
85ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth#undef EQ
86ec8058f64bbcd79bd47748f4cf8628123dd3bae6Chandler Carruth}
87f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor
88f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregornamespace PR10291 {
89f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor  template<typename T>
90f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor  class X
91f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor  {
92f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor  public:
93f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor
94f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor    X() : i(0) { }
95f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor
96f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor    void foo()
97f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor    {
98f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor      throw
99f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor        i == 0u ?
100f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor        5 : 6;
101f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor    }
102f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor
103f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor  private:
104f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor    int i;
105f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor  };
106f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor
107f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor  X<int> x;
108f8b6e1591b5c5085cf4dec8df657e32a68053b12Douglas Gregor}
1096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace PR19724 {
1116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesclass stream {
1126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} cout, cin;
1136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstream &operator<(stream &s, int);
1156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool operator<(stream &s, stream &s2);
1166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid test() {
1186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  cout < 5;    // no warning, operator returns a reference
1196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  cout < cin;  // expected-warning {{relational comparison result unused}}
1206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
1216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
1226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace PR19791 {
1246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct S {
1256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  void operator!=(int);
1266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  int operator==(int);
1276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines};
1286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid test() {
1306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  S s;
1316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  s != 1;
1326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  s == 1;  // expected-warning{{equality comparison result unused}}
1336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines           // expected-note@-1{{use '=' to turn this equality comparison into an assignment}}
1346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
1356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
136