// RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s


struct Spacer { int x; };
struct A { double array[2]; };
struct B : Spacer, A { };

B &getB();

// CHECK: define %struct.A* @_Z4getAv()
// CHECK: call %struct.B* @_Z4getBv()
// CHECK-NEXT: bitcast %struct.B*
// CHECK-NEXT: getelementptr i8*
// CHECK-NEXT: bitcast i8* {{.*}} to %struct.A*
// CHECK-NEXT: ret %struct.A*
A &&getA() { return static_cast<A&&>(getB()); }

int &getIntLValue();
int &&getIntXValue();
int getIntPRValue();

// CHECK: define i32* @_Z2f0v()
// CHECK: call i32* @_Z12getIntLValuev()
// CHECK-NEXT: ret i32*
int &&f0() { return static_cast<int&&>(getIntLValue()); }

// CHECK: define i32* @_Z2f1v()
// CHECK: call i32* @_Z12getIntXValuev()
// CHECK-NEXT: ret i32*
int &&f1() { return static_cast<int&&>(getIntXValue()); }

// CHECK: define i32* @_Z2f2v
// CHECK: call i32 @_Z13getIntPRValuev()
// CHECK-NEXT: store i32 {{.*}}, i32*
// CHECK-NEXT: ret i32*
int &&f2() { return static_cast<int&&>(getIntPRValue()); }

bool ok;

class C
{
   int* state_;

   C(const C&) = delete;
   C& operator=(const C&) = delete;
public:
  C(int state) : state_(new int(state)) { }
  
  C(C&& a) {
    state_ = a.state_; 
    a.state_ = 0;
  }

  ~C() {
    delete state_; 
    state_ = 0;
  }
};

C test();

// CHECK: define void @_Z15elide_copy_initv
void elide_copy_init() {
  ok = false;
  // CHECK: call void @_Z4testv
  C a = test();
  // CHECK-NEXT: call void @_ZN1CD1Ev
  // CHECK-NEXT: ret void
}

// CHECK: define void @_Z16test_move_returnv
C test_move_return() {
  // CHECK: call void @_ZN1CC1Ei
  C a1(3);
  // CHECK: call void @_ZN1CC1Ei
  C a2(4);
  if (ok)
    // CHECK: call void @_ZN1CC1EOS_
    return a1;
  // CHECK: call void @_ZN1CC1EOS_
  return a2;
  // CHECK: call void @_ZN1CD1Ev
  // CHECK: call void @_ZN1CD1Ev
  //CHECK:  ret void
}

// PR10800: don't crash
namespace test1 {
  int &&move(int&);

  struct A { A(int); };
  struct B {
    A a;
    B(int i);
  };

  // CHECK:    define void @_ZN5test11BC2Ei(
  // CHECK:      [[T0:%.*]] = call i32* @_ZN5test14moveERi(
  // CHECK-NEXT: [[T1:%.*]] = load i32* [[T0]]
  // CHECK-NEXT: call void @_ZN5test11AC1Ei({{.*}}, i32 [[T1]])
  // CHECK-NEXT: ret void
  B::B(int i) : a(move(i)) {}
}

// PR11009
struct MoveConvertible {
  operator int&& () const;
};
void moveConstruct() {
  (void)(int)MoveConvertible();
}
