1*abc8812dSJason Rice // RUN: %clang_cc1 -std=c++26 -triple x86_64-linux-gnu -emit-llvm -o - %s | FileCheck %s 2*abc8812dSJason Rice 3*abc8812dSJason Rice namespace std { 4*abc8812dSJason Rice using size_t = decltype(sizeof(0)); 5*abc8812dSJason Rice template<typename> struct tuple_size; 6*abc8812dSJason Rice template<size_t, typename> struct tuple_element; 7*abc8812dSJason Rice } 8*abc8812dSJason Rice 9*abc8812dSJason Rice struct Y { int n; }; 10*abc8812dSJason Rice struct X { X(); X(Y); X(const X&); ~X(); }; 11*abc8812dSJason Rice 12*abc8812dSJason Rice struct A { int a : 13; bool b; }; 13*abc8812dSJason Rice 14*abc8812dSJason Rice struct B {}; 15*abc8812dSJason Rice template<> struct std::tuple_size<B> { enum { value = 2 }; }; 16*abc8812dSJason Rice template<> struct std::tuple_element<0,B> { using type = X; }; 17*abc8812dSJason Rice template<> struct std::tuple_element<1,B> { using type = const int&; }; 18*abc8812dSJason Rice template<int N> auto get(B) { 19*abc8812dSJason Rice if constexpr (N == 0) 20*abc8812dSJason Rice return Y(); 21*abc8812dSJason Rice else 22*abc8812dSJason Rice return 0.0; 23*abc8812dSJason Rice } 24*abc8812dSJason Rice 25*abc8812dSJason Rice using C = int[2]; 26*abc8812dSJason Rice 27*abc8812dSJason Rice template<typename T> T &make(); 28*abc8812dSJason Rice 29*abc8812dSJason Rice // CHECK-LABEL: define {{.*}} @_Z8big_testIiEiv() 30*abc8812dSJason Rice template <typename T> 31*abc8812dSJason Rice int big_test() { 32*abc8812dSJason Rice A& a = make<A>(); 33*abc8812dSJason Rice A: 34*abc8812dSJason Rice auto &[...an] = a; 35*abc8812dSJason Rice an...[0] = 5; 36*abc8812dSJason Rice // CHECK: %[[a1:.*]].load = load i16, ptr %[[BITFIELD:.*]], 37*abc8812dSJason Rice // CHECK: %[[a1]].clear = and i16 %[[a1]].load, -8192 38*abc8812dSJason Rice // CHECK: %[[a1]].set = or i16 %[[a1]].clear, 5 39*abc8812dSJason Rice // CHECK: store i16 %[[a1]].set, ptr %[[BITFIELD]], 40*abc8812dSJason Rice B: 41*abc8812dSJason Rice auto [b1, ...bn] = make<B>(); 42*abc8812dSJason Rice // CHECK: @_Z4makeI1BERT_v() 43*abc8812dSJason Rice // CHECK: call i32 @_Z3getILi0EEDa1B() 44*abc8812dSJason Rice // CHECK: call void @_ZN1XC1E1Y(ptr {{[^,]*}} %[[b1:.*]], i32 45*abc8812dSJason Rice // 46*abc8812dSJason Rice // CHECK: call noundef double @_Z3getILi1EEDa1B() 47*abc8812dSJason Rice // CHECK: %[[cvt:.*]] = fptosi double %{{.*}} to i32 48*abc8812dSJason Rice // CHECK: store i32 %[[cvt]], ptr %[[b2:.*]], 49*abc8812dSJason Rice // CHECK: store ptr %[[b2]], ptr %[[b2ref:.*]], 50*abc8812dSJason Rice int bn2 = bn...[0]; 51*abc8812dSJason Rice // CHECK load ptr, ptr %[[b2ref]] 52*abc8812dSJason Rice 53*abc8812dSJason Rice return 0; 54*abc8812dSJason Rice } 55*abc8812dSJason Rice 56*abc8812dSJason Rice int g = big_test<int>(); 57