1 // Test for decltype of direct decomposition. 2 // { dg-do compile { target c++17 } } 3 4 template <class,class> struct same_type; 5 template <class T> struct same_type<T,T> {}; 6 7 struct A { 8 int i; 9 const int ci = 42; 10 mutable int mi; 11 int& r = i; 12 const int& cr = ci; 13 } a; 14 15 void f() { 16 auto [i,ci,mi,r,cr] = a; 17 18 same_type<decltype(i),int>{}; 19 same_type<decltype(ci),const int>{}; 20 same_type<decltype(mi),int>{}; 21 same_type<decltype(r),int&>{}; 22 same_type<decltype(cr),const int&>{}; 23 } 24 void frr() { 25 auto &&[i,ci,mi,r,cr] = a; 26 27 same_type<decltype(i),int>{}; 28 same_type<decltype(ci),const int>{}; 29 same_type<decltype(mi),int>{}; 30 same_type<decltype(r),int&>{}; 31 same_type<decltype(cr),const int&>{}; 32 } 33 void fc() { 34 const auto [i,ci,mi,r,cr] = a; 35 36 same_type<decltype(i),const int>{}; 37 same_type<decltype(ci),const int>{}; 38 same_type<decltype(mi),int>{}; 39 same_type<decltype(r),int&>{}; 40 same_type<decltype(cr),const int&>{}; 41 } 42 void frc() { 43 const A ca{}; 44 auto &[i,ci,mi,r,cr] = ca; 45 46 same_type<decltype(i),const int>{}; 47 same_type<decltype(ci),const int>{}; 48 same_type<decltype(mi),int>{}; 49 same_type<decltype(r),int&>{}; 50 same_type<decltype(cr),const int&>{}; 51 } 52