| // { dg-do compile { target c++11 } } |
| |
| // Copyright (C) 2016-2021 Free Software Foundation, Inc. |
| // |
| // This file is part of the GNU ISO C++ Library. This library is free |
| // software; you can redistribute it and/or modify it under the |
| // terms of the GNU General Public License as published by the |
| // Free Software Foundation; either version 3, or (at your option) |
| // any later version. |
| |
| // This library is distributed in the hope that it will be useful, |
| // but WITHOUT ANY WARRANTY; without even the implied warranty of |
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| // GNU General Public License for more details. |
| |
| // You should have received a copy of the GNU General Public License along |
| // with this library; see the file COPYING3. If not see |
| // <http://www.gnu.org/licenses/>. |
| |
| #include <tuple> |
| |
| // This testcase instantiates a tuple with an incomplete type. |
| // That is undefined behavior, but our tuple implementation manages |
| // to cope with this particular case. The attempt to provide |
| // a tuple implementation that yields the right result for |
| // traits like is_copy_constructible and is_move_constructible as |
| // per LWG 2729 results in ill-formed copy/move constructors being |
| // generated for a tuple that contains an incomplete type. |
| // Once we get concepts, we can solve that problem much easier. |
| |
| template <typename... Args> struct execution_context |
| { |
| typedef std::tuple<Args...> args_tpl_t; |
| typedef std::tuple<execution_context, typename std::decay<Args>::type...> |
| ret_tpl_t; |
| execution_context(); |
| execution_context(execution_context &&); |
| ret_tpl_t operator()() { |
| args_tpl_t data; |
| return tuple_cat(std::forward_as_tuple(execution_context()), data); |
| } |
| }; |
| |
| void fn1() |
| { |
| execution_context<int> cc; |
| cc(); |
| } |
| |