PR c++/56973, DR 696 - capture constant variables only as needed.
[official-gcc.git] / gcc / testsuite / g++.dg / cpp1y / pr68388.C
blobf1a342a43bdebd209f19344fa9f8164b26d25c86
1 // { dg-do compile { target c++14 } }
3 namespace std {
4 typedef int size_t;
5 template <std::size_t... Indexes>
6 struct index_sequence {};
9 template <class...> class Tuple {};
11 template <std::size_t I, class TFirst>
12 auto get(Tuple<TFirst>) {
13   return TFirst();
16 template <std::size_t I, class Functor, class T1, class T2>
17 auto apply_impl(Functor f, T1 t1, T2 t2) {
18   return f(get<I>(t1), get<I>(t2));
21 template <std::size_t... Indexes, class Functor, class T1, class T2>        
22 auto map_impl(std::index_sequence<Indexes...>, Functor f, T1 t1, T2 t2) {
23   Tuple<decltype(apply_impl<Indexes>(f, t1, t2))...>();
26 template <class Functor, class T1, class T2>
27 auto map_impl(Functor f, T1 t1, T2 t2) {
28   map_impl(std::index_sequence<0>(), f, t1, t2);
30                                  
31 struct Less {                                                
32   template <class Lhs, class Rhs>                     
33   auto operator()(Lhs lhs, Rhs rhs) -> decltype(lhs < rhs) {
34     return lhs < rhs;
35   }
37                                                                      
38 int main() {
39   auto t1 = Tuple<int>();
40   auto t2 = Tuple<int>();
41   map_impl(Less(), t1, t2);