// RUN: %clang_cc1 -fsyntax-only -verify -Wunused %s
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 -Wunused %s
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -Wunused %s
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++17 -Wunused %s

// PR4103 : Make sure we don't get a bogus unused expression warning
namespace PR4103 {
  class APInt {
    char foo; // expected-warning {{private field 'foo' is not used}}
  };
  class APSInt : public APInt {
    char bar; // expected-warning {{private field 'bar' is not used}}
  public:
    APSInt &operator=(const APSInt &RHS);
  };

  APSInt& APSInt::operator=(const APSInt &RHS) {
    APInt::operator=(RHS);
    return *this;
  }

  template<typename T>
  struct X {
    X();
  };

  void test() {
    X<int>();
  }
}

namespace derefvolatile {
  void f(volatile char* x) {
    *x;
#if __cplusplus <= 199711L
    // expected-warning@-2 {{expression result unused; assign into a variable to force a volatile load}}
#endif
    (void)*x;
#if __cplusplus <= 199711L
    // expected-warning@-2 {{expression result unused; assign into a variable to force a volatile load}}
#endif
    volatile char y = 10;
    (void)y; // don't warn here, because it's a common pattern.
  }
}

// <rdar://problem/12359208>
namespace AnonObject {
  struct Foo {
    Foo(const char* const message);
    ~Foo();
  };
  void f() {
    Foo("Hello World!");  // don't warn
    int(1); // expected-warning {{expression result unused}}
  }
}

// Test that constructing an object (which may have side effects) with
// constructor arguments which are dependent doesn't produce an unused value
// warning.
namespace UnresolvedLookup {
  struct Foo {
    Foo(int i, int j);
  };
  template <typename T>
  struct Bar {
    void f(T t) {
      Foo(t, 0);  // no warning
    }
  };
}

#if __cplusplus >= 201703L
namespace PR33839 {
  void a() {
    struct X { int a, b; } x;
    auto [a, b] = x; // expected-warning {{unused variable '[a, b]'}}
    auto [c, d] = x;
    (void)d;
  }

  template<typename T> void f() {
    struct A { int n; } a[1];
    for (auto [x] : a) {
      (void)x;
    }
    auto [y] = a[0]; // expected-warning {{unused}}
  }
  template<bool b> void g() {
    struct A { int n; } a[1];
    for (auto [x] : a) {
      if constexpr (b)
        (void)x;
    }

    auto [y] = a[0];
    if constexpr (b)
      (void)y; // ok, even when b == false
  }
  template<typename T> void h() {
    struct A { int n; } a[1];
    for (auto [x] : a) { // expected-warning {{unused variable '[x]'}}
    }
  }
  void use() { 
    f<int>(); // expected-note {{instantiation of}}
    g<true>();
    g<false>();
    h<int>(); // expected-note {{instantiation of}}
  }
}
#endif
