// PR c++/106276
// { dg-do compile { target c++11 } }
// { dg-options "-Wpessimizing-move" }
// Define std::move.
namespace std {
  template<typename _Tp>
    struct remove_reference
    { typedef _Tp   type; };
  template<typename _Tp>
    struct remove_reference<_Tp&>
    { typedef _Tp   type; };
  template<typename _Tp>
    struct remove_reference<_Tp&&>
    { typedef _Tp   type; };
  template<typename _Tp>
    constexpr typename std::remove_reference<_Tp>::type&&
    move(_Tp&& __t) noexcept
    { return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); }
}
struct A { A(); A(const A&) = delete; A(A&&); };
struct B { B(A); };
struct X { };
void foo (A);
void bar (X);
void
fn1 ()
{
  A a1 = std::move (A()); // { dg-warning "moving a temporary object prevents copy elision" }
  A a2 = std::move (A{}); // { dg-warning "moving a temporary object prevents copy elision" }
  A a3(std::move (A())); // { dg-warning "moving a temporary object prevents copy elision" }
  A a4(std::move (A{})); // { dg-warning "moving a temporary object prevents copy elision" }
  A a5{std::move (A())}; // { dg-warning "moving a temporary object prevents copy elision" }
  A a6{std::move (A{})}; // { dg-warning "moving a temporary object prevents copy elision" }
  A a7 = {std::move (A())}; // { dg-warning "moving a temporary object prevents copy elision" }
  A a8 = {std::move (A{})}; // { dg-warning "moving a temporary object prevents copy elision" }
  B b1 = std::move (A()); // { dg-warning "moving a temporary object prevents copy elision" }
  B b2(std::move (A())); // { dg-warning "moving a temporary object prevents copy elision" }
  B b3{std::move (A())}; // { dg-warning "moving a temporary object prevents copy elision" }
  B b4 = {std::move (A())}; // { dg-warning "moving a temporary object prevents copy elision" }
  X x1 = std::move (X()); // { dg-warning "moving a temporary object prevents copy elision" }
  X x2 = std::move (X{}); // { dg-warning "moving a temporary object prevents copy elision" }
  X x3(std::move (X())); // { dg-warning "moving a temporary object prevents copy elision" }
  X x4(std::move (X{})); // { dg-warning "moving a temporary object prevents copy elision" }
  X x5{std::move (X())}; // { dg-warning "moving a temporary object prevents copy elision" }
  X x6{std::move (X{})}; // { dg-warning "moving a temporary object prevents copy elision" }
  X x7 = {std::move (X())}; // { dg-warning "moving a temporary object prevents copy elision" }
  X x8 = {std::move (X{})}; // { dg-warning "moving a temporary object prevents copy elision" }
  foo (std::move (A())); // { dg-warning "moving a temporary object prevents copy elision" }
  foo (std::move (A{})); // { dg-warning "moving a temporary object prevents copy elision" }
  bar (std::move (X())); // { dg-warning "moving a temporary object prevents copy elision" }
  bar (std::move (X{})); // { dg-warning "moving a temporary object prevents copy elision" }
  foo (std::move (a1));
  bar (std::move (x1));
}