// { dg-lto-do link } // { dg-lto-options { { -std=gnu++14 -flto -g -Wno-return-type } { -std=gnu++14 -flto -g -O2 -fno-inline -flto-partition=max -Wno-return-type } } } // { dg-extra-ld-options "-r -nostdlib" } namespace std { inline namespace __cxx11 {} template struct integral_constant { static constexpr _Tp value = 0; }; template struct __and_; struct is_member_object_pointer : integral_constant {}; template struct is_member_function_pointer : integral_constant {}; template struct remove_reference { typedef int type; }; template class C; template struct __result_of_impl; template struct __result_of_impl { typedef decltype(0) type; }; template struct C<_Functor(_ArgTypes...)> : __result_of_impl::type>::value, _Functor> {}; template using result_of_t = typename C<_Tp>::type; template void forward() { } template _Tp move(_Tp) {} namespace __cxx11 { class basic_string typedef string; } template struct allocator_traits { typedef decltype(0) pointer; }; } struct F : std::allocator_traits {}; namespace std { namespace __cxx11 { class basic_string { public: struct _Alloc_hider : F { _Alloc_hider(pointer); } _M_dataplus; basic_string(int) : _M_dataplus(0) {} ~basic_string(); }; } template class function; template class _Base_manager { protected: static _Functor *_M_get_pointer(int) {} }; template class _Function_handler; template class _Function_handler<_Res(_ArgTypes...), _Functor> : _Base_manager<_Functor> { public: static _Res _M_invoke(const int &) { (*_Base_manager<_Functor>::_M_get_pointer(0))(); } }; template using __check_func_return_type = int; template class function<_Res(_ArgTypes...)> { template using _Invoke = decltype(0); template using _Callable = __and_<__check_func_return_type<_Invoke<_Functor>, _Res>>; template using _Requires = int; public: template , void>> function(_Functor); using _Invoker_type = _Res (*)(const int &); _Invoker_type _M_invoker; }; template template function<_Res(_ArgTypes...)>::function(_Functor) { _M_invoker = _Function_handler<_Res(), _Functor>::_M_invoke; } class unique_ptr { public: ~unique_ptr(); }; template _Tp make_unique(_Args... __args) { _Tp(__args...); } } class A { public: template T as(); }; class variables_map { public: A operator[](std::basic_string); }; class B { public: variables_map configuration(); void run(int, int, std::function); }; class H; struct G { enum {} _state; }; class D { G _local_state; std::unique_ptr _task; template void schedule(Func func) { struct task_with_state { task_with_state(Func func) : _func(func) {} Func _func; } tws = std::make_unique(std::move(func)); } friend H; }; template using futurize_t = H; class H { D *_promise; template void schedule(Func func) { G __trans_tmp_1; struct task_with_ready_state { task_with_ready_state(Func, G) { }; }; std::make_unique(std::move(func), __trans_tmp_1); _promise->schedule(std::move(func)); } template void then(Func func, Param) { using P = D; P pr; schedule([ pr = std::move(pr), func, param = std::forward ]{}); } public: template futurize_t> then(Func) { then(0, [] {}); } } clients; int main() { B app; app.run(0, 0, [&] { auto config = app.configuration()[0].as(); clients.then([] {}); }); return 0; }