xref: /llvm-project/clang/test/CodeGenCXX/cxx2c-decomposition.cpp (revision abc8812df02599fc413d9ed77b992f8236ed2af9)
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