Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -fsyntax-only -verify %s
      2 
      3 // PR4103 : Make sure we don't get a bogus unused expression warning
      4 namespace PR4103 {
      5   class APInt {
      6     char foo;
      7   };
      8   class APSInt : public APInt {
      9     char bar;
     10   public:
     11     APSInt &operator=(const APSInt &RHS);
     12   };
     13 
     14   APSInt& APSInt::operator=(const APSInt &RHS) {
     15     APInt::operator=(RHS);
     16     return *this;
     17   }
     18 
     19   template<typename T>
     20   struct X {
     21     X();
     22   };
     23 
     24   void test() {
     25     X<int>();
     26   }
     27 }
     28 
     29 namespace derefvolatile {
     30   void f(volatile char* x) {
     31     *x; // expected-warning {{expression result unused; assign into a variable to force a volatile load}}
     32     (void)*x; // expected-warning {{expression result unused; assign into a variable to force a volatile load}}
     33     volatile char y = 10;
     34     (void)y; // don't warn here, because it's a common pattern.
     35   }
     36 }
     37 
     38 // <rdar://problem/12359208>
     39 namespace AnonObject {
     40   struct Foo {
     41     Foo(const char* const message);
     42     ~Foo();
     43   };
     44   void f() {
     45     Foo("Hello World!");  // don't warn
     46     int(1); // expected-warning {{expression result unused}}
     47   }
     48 }
     49 
     50 // Test that constructing an object (which may have side effects) with
     51 // constructor arguments which are dependent doesn't produce an unused value
     52 // warning.
     53 namespace UnresolvedLookup {
     54   struct Foo {
     55     Foo(int i, int j);
     56   };
     57   template <typename T>
     58   struct Bar {
     59     void f(T t) {
     60       Foo(t, 0);  // no warning
     61     }
     62   };
     63 }
     64