// RUN: %clang_cc1 -std=c++1z -triple x86_64-linux-gnu -emit-llvm -o - %s | FileCheck %s

namespace std {
  using size_t = decltype(sizeof(0));
  template<typename> struct tuple_size;
  template<size_t, typename> struct tuple_element;
}

struct Y { int n; };
struct X { X(); X(Y); X(const X&); ~X(); };

struct A { int a : 13; bool b; };

struct B {};
template<> struct std::tuple_size<B> { enum { value = 2 }; };
template<> struct std::tuple_element<0,B> { using type = X; };
template<> struct std::tuple_element<1,B> { using type = const int&; };
template<int N> auto get(B) {
  if constexpr (N == 0)
    return Y();
  else
    return 0.0;
}

using C = int[2];

typedef int D __attribute__((ext_vector_type(2)));

using E = _Complex int;

template<typename T> T &make();

// CHECK: @_ZDC2a12a2E ={{.*}} global {{.*}} zeroinitializer, align 4
auto [a1, a2] = make<A>();
// CHECK: @_ZDC2b12b2E ={{.*}} global {{.*}} zeroinitializer, align 1
// CHECK: @b1 ={{.*}} global {{.*}}* null, align 8
// CHECK: @_ZGR2b1_ = internal global {{.*}} zeroinitializer, align 1
// CHECK: @b2 ={{.*}} global i32* null, align 8
// CHECK: @_ZGR2b2_ = internal global i32 0, align 4
auto [b1, b2] = make<B>();
// CHECK: @_ZDC2c12c2E ={{.*}} global [2 x i32]* null, align 8
auto &[c1, c2] = make<C>();
// CHECK: @_ZDC2d12d2E ={{.*}} global <2 x i32> zeroinitializer, align 8
auto [d1, d2] = make<D>();
// CHECK: @_ZDC2e12e2E ={{.*}} global { i32, i32 } zeroinitializer, align 4
auto [e1, e2] = make<E>();

// CHECK: call {{.*}}* @_Z4makeI1AERT_v()
// CHECK: call {{.*}}memcpy{{.*}}@_ZDC2a12a2E

// CHECK: @_Z4makeI1BERT_v()
//   CHECK: call i32 @_Z3getILi0EEDa1B()
//   CHECK: call void @_ZN1XC1E1Y({{.*}}* {{[^,]*}} @_ZGR2b1_, i32
//   CHECK: call i32 @__cxa_atexit({{.*}}@_ZN1XD1Ev{{.*}}@_ZGR2b1_
//   CHECK: store {{.*}}* @_ZGR2b1_,
//
//   CHECK: call double @_Z3getILi1EEDa1B()
//   CHECK: fptosi double %{{.*}} to i32
//   CHECK: store i32 %{{.*}}, i32* @_ZGR2b2_
//   CHECK: store i32* @_ZGR2b2_, i32** @b2

// CHECK: call {{.*}}* @_Z4makeIA2_iERT_v()
// CHECK: store {{.*}}, [2 x i32]** @_ZDC2c12c2E

// CHECK: call {{.*}}* @_Z4makeIDv2_iERT_v()
// CHECK: store {{.*}}, <2 x i32>* @_ZDC2d12d2E, align 8

// CHECK: call {{.*}}* @_Z4makeICiERT_v()
// CHECK: store i32 %{{.*}}, i32* getelementptr inbounds ({ i32, i32 }, { i32, i32 }* @_ZDC2e12e2E, i32 0, i32 0)
// CHECK: store i32 %{{.*}}, i32* getelementptr inbounds ({ i32, i32 }, { i32, i32 }* @_ZDC2e12e2E, i32 0, i32 1)

// CHECK: define{{.*}} i32 @_Z12test_globalsv()
int test_globals() {
  return a2 + b2 + c2 + d2 + e2;
  // CHECK: load i8, i8* getelementptr inbounds (%struct.A, %struct.A* @_ZDC2a12a2E, i32 0, i32 1)
  //
  // CHECK: %[[b2:.*]] = load i32*, i32** @b2
  // CHECK: load i32, i32* %[[b2]]
  //
  // CHECK: %[[c1c2:.*]] = load [2 x i32]*, [2 x i32]** @_ZDC2c12c2E
  // CHECK: %[[c2:.*]] = getelementptr inbounds [2 x i32], [2 x i32]* %[[c1c2]], i64 0, i64 1
  // CHECK: load i32, i32* %[[c2]]
  //
  // CHECK: %[[d1d2:.*]] = load <2 x i32>, <2 x i32>* @_ZDC2d12d2E
  // CHECK: extractelement <2 x i32> %[[d1d2]], i32 1
  //
  // CHECK: load i32, i32* getelementptr inbounds ({ i32, i32 }, { i32, i32 }* @_ZDC2e12e2E, i32 0, i32 1)
}

// CHECK: define{{.*}} i32 @_Z11test_localsv()
int test_locals() {
  auto [b1, b2] = make<B>();

  // CHECK: @_Z4makeI1BERT_v()
  //   CHECK: call i32 @_Z3getILi0EEDa1B()
  //   CHECK: call void @_ZN1XC1E1Y({{.*}}* {{[^,]*}} %[[b1:.*]], i32
  //
  //   CHECK: call double @_Z3getILi1EEDa1B()
  //   CHECK: %[[cvt:.*]] = fptosi double %{{.*}} to i32
  //   CHECK: store i32 %[[cvt]], i32* %[[b2:.*]],
  //   CHECK: store i32* %[[b2]], i32** %[[b2ref:.*]],

  return b2;
  // CHECK: %[[b2:.*]] = load i32*, i32** %[[b2ref]]
  // CHECK: load i32, i32* %[[b2]]

  // CHECK: call {{.*}}@_ZN1XD1Ev({{.*}}%[[b1]])
}

// CHECK: define{{.*}} void @_Z13test_bitfieldR1A(
void test_bitfield(A &a) {
  auto &[a1, a2] = a;
  a1 = 5;
  // CHECK: load i16, i16* %[[BITFIELD:.*]],
  // CHECK: and i16 %{{.*}}, -8192
  // CHECK: or i16 %{{.*}}, 5
  // CHECK: store i16 %{{.*}}, i16* %[[BITFIELD]],
}

// CHECK-LABEL: define {{.*}}@_Z18test_static_simple
void test_static_simple() {
  static auto [x1, x2] = make<A>();
  // CHECK: load atomic {{.*}}i64* @_ZGVZ18test_static_simplevEDC2x12x2E
  // CHECK: br i1
  // CHECK: @__cxa_guard_acquire(
  // CHECK: call {{.*}} @_Z4makeI1AERT_v(
  // CHECK: memcpy{{.*}} @_ZZ18test_static_simplevEDC2x12x2E
  // CHECK: @__cxa_guard_release(
}

// CHECK-LABEL: define {{.*}}@_Z17test_static_tuple
int test_static_tuple() {
  // Note that the desugaring specified for this construct requires three
  // separate guarded initializations. It is possible for an exception to be
  // thrown after the first initialization and before the second, and if that
  // happens, we are not permitted to rerun the first initialization, so we
  // can't combine these into a single guarded initialization in general.
  static auto [x1, x2] = make<B>();

  // Initialization of the implied variable.
  // CHECK: load atomic {{.*}} @_ZGVZ17test_static_tuplevEDC2x12x2E
  // CHECK: br i1
  // CHECK: @__cxa_guard_acquire({{.*}} @_ZGVZ17test_static_tuplevEDC2x12x2E)
  // CHECK: call {{.*}} @_Z4makeI1BERT_v(
  // CHECK: @__cxa_guard_release({{.*}} @_ZGVZ17test_static_tuplevEDC2x12x2E)

  // Initialization of the secret 'x1' variable.
  // CHECK: load atomic {{.*}} @_ZGVZ17test_static_tuplevE2x1
  // CHECK: br i1
  // CHECK: @__cxa_guard_acquire({{.*}} @_ZGVZ17test_static_tuplevE2x1)
  // CHECK: call {{.*}} @_Z3getILi0EEDa1B(
  // CHECK: call {{.*}} @_ZN1XC1E1Y({{.*}} @_ZGRZ17test_static_tuplevE2x1_,
  // CHECK: call {{.*}} @__cxa_atexit({{.*}} @_ZN1XD1Ev {{.*}} @_ZGRZ17test_static_tuplevE2x1_
  // CHECK: store {{.*}} @_ZGRZ17test_static_tuplevE2x1_, {{.*}} @_ZZ17test_static_tuplevE2x1
  // CHECK: call void @__cxa_guard_release({{.*}} @_ZGVZ17test_static_tuplevE2x1)

  // Initialization of the secret 'x2' variable.
  // CHECK: load atomic {{.*}} @_ZGVZ17test_static_tuplevE2x2
  // CHECK: br i1
  // CHECK: @__cxa_guard_acquire({{.*}} @_ZGVZ17test_static_tuplevE2x2)
  // CHECK: call {{.*}} @_Z3getILi1EEDa1B(
  // CHECK: store {{.*}}, {{.*}} @_ZGRZ17test_static_tuplevE2x2_
  // CHECK: store {{.*}} @_ZGRZ17test_static_tuplevE2x2_, {{.*}} @_ZZ17test_static_tuplevE2x2
  // CHECK: call void @__cxa_guard_release({{.*}} @_ZGVZ17test_static_tuplevE2x2)

  struct Inner {
    // CHECK-LABEL: define {{.*}}@_ZZ17test_static_tuplevEN5Inner1fEv(
    // FIXME: This first load should be constant-folded to the _ZGV... temporary.
    // CHECK: load {{.*}} @_ZZ17test_static_tuplevE2x2
    // CHECK: load
    // CHECK: ret
    int f() { return x2; }
  };
  return Inner().f();
}
