Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -fsyntax-only -fcxx-exceptions -verify -Wno-unused -Wunused-comparison %s
      2 
      3 struct A {
      4   bool operator==(const A&);
      5   bool operator!=(const A&);
      6   A operator|=(const A&);
      7   operator bool();
      8 };
      9 
     10 void test() {
     11   int x, *p;
     12   A a, b;
     13 
     14   x == 7; // expected-warning {{equality comparison result unused}} \
     15           // expected-note {{use '=' to turn this equality comparison into an assignment}}
     16   x != 7; // expected-warning {{inequality comparison result unused}} \
     17           // expected-note {{use '|=' to turn this inequality comparison into an or-assignment}}
     18   7 == x; // expected-warning {{equality comparison result unused}}
     19   p == p; // expected-warning {{equality comparison result unused}} \
     20           // expected-note {{use '=' to turn this equality comparison into an assignment}} \
     21           // expected-warning {{self-comparison always evaluates to true}}
     22   a == a; // expected-warning {{equality comparison result unused}} \
     23           // expected-note {{use '=' to turn this equality comparison into an assignment}}
     24   a == b; // expected-warning {{equality comparison result unused}} \
     25           // expected-note {{use '=' to turn this equality comparison into an assignment}}
     26   a != b; // expected-warning {{inequality comparison result unused}} \
     27           // expected-note {{use '|=' to turn this inequality comparison into an or-assignment}}
     28   A() == b; // expected-warning {{equality comparison result unused}}
     29   if (42) x == 7; // expected-warning {{equality comparison result unused}} \
     30                   // expected-note {{use '=' to turn this equality comparison into an assignment}}
     31   else if (42) x == 7; // expected-warning {{equality comparison result unused}} \
     32                        // expected-note {{use '=' to turn this equality comparison into an assignment}}
     33   else x == 7; // expected-warning {{equality comparison result unused}} \
     34                // expected-note {{use '=' to turn this equality comparison into an assignment}}
     35   do x == 7; // expected-warning {{equality comparison result unused}} \
     36              // expected-note {{use '=' to turn this equality comparison into an assignment}}
     37   while (false);
     38   while (false) x == 7; // expected-warning {{equality comparison result unused}} \
     39                         // expected-note {{use '=' to turn this equality comparison into an assignment}}
     40   for (x == 7; // expected-warning {{equality comparison result unused}} \
     41                // expected-note {{use '=' to turn this equality comparison into an assignment}}
     42        x == 7; // No warning -- result is used
     43        x == 7) // expected-warning {{equality comparison result unused}} \
     44                // expected-note {{use '=' to turn this equality comparison into an assignment}}
     45     x == 7; // expected-warning {{equality comparison result unused}} \
     46             // expected-note {{use '=' to turn this equality comparison into an assignment}}
     47   switch (42) default: x == 7; // expected-warning {{equality comparison result unused}} \
     48                                // expected-note {{use '=' to turn this equality comparison into an assignment}}
     49   switch (42) case 42: x == 7; // expected-warning {{equality comparison result unused}} \
     50                                // expected-note {{use '=' to turn this equality comparison into an assignment}}
     51   switch (42) {
     52     case 1:
     53     case 2:
     54     default:
     55     case 3:
     56     case 4:
     57       x == 7; // expected-warning {{equality comparison result unused}} \
     58               // expected-note {{use '=' to turn this equality comparison into an assignment}}
     59   }
     60 
     61   (void)(x == 7);
     62   (void)(p == p); // expected-warning {{self-comparison always evaluates to true}}
     63   { bool b = x == 7; }
     64 
     65   { bool b = ({ x == 7; // expected-warning {{equality comparison result unused}} \
     66                         // expected-note {{use '=' to turn this equality comparison into an assignment}}
     67                 x == 7; }); } // no warning on the second, its result is used!
     68 
     69 #define EQ(x,y) (x) == (y)
     70   EQ(x, 5);
     71 #undef EQ
     72 }
     73 
     74 namespace PR10291 {
     75   template<typename T>
     76   class X
     77   {
     78   public:
     79 
     80     X() : i(0) { }
     81 
     82     void foo()
     83     {
     84       throw
     85         i == 0u ?
     86         5 : 6;
     87     }
     88 
     89   private:
     90     int i;
     91   };
     92 
     93   X<int> x;
     94 }
     95