view gcc/testsuite/g++.dg/lto/pr65549_0.C @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
line wrap: on
line source

// { 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 <typename _Tp, _Tp> struct integral_constant {
  static constexpr _Tp value = 0;
};
template <typename> struct __and_;
struct is_member_object_pointer : integral_constant<bool, false> {};
template <typename>
struct is_member_function_pointer : integral_constant<bool, false> {};
template <typename> struct remove_reference { typedef int type; };
template <typename> class C;
template <bool, int, typename...> struct __result_of_impl;
template <typename _Functor, typename... _ArgTypes>
struct __result_of_impl<false, 0, _Functor, _ArgTypes...> {
  typedef decltype(0) type;
};
template <typename _Functor, typename... _ArgTypes>
struct C<_Functor(_ArgTypes...)>
    : __result_of_impl<is_member_object_pointer::value,
                       is_member_function_pointer<
                           typename remove_reference<_Functor>::type>::value,
                       _Functor> {};
template <typename _Tp> using result_of_t = typename C<_Tp>::type;
template <typename> void forward() { }
template <typename _Tp> _Tp move(_Tp) {}
namespace __cxx11 {
class basic_string typedef string;
}
template <typename> struct allocator_traits { typedef decltype(0) pointer; };
}
struct F : std::allocator_traits<int> {};
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 <typename> class function;
template <typename _Functor> class _Base_manager {
protected:
  static _Functor *_M_get_pointer(int) {}
};
template <typename, typename> class _Function_handler;
template <typename _Res, typename _Functor, typename... _ArgTypes>
class _Function_handler<_Res(_ArgTypes...), _Functor>
    : _Base_manager<_Functor> {
public:
  static _Res _M_invoke(const int &) {
    (*_Base_manager<_Functor>::_M_get_pointer(0))();
  }
};
template <typename, typename> using __check_func_return_type = int;
template <typename _Res, typename... _ArgTypes>
class function<_Res(_ArgTypes...)> {
  template <typename> using _Invoke = decltype(0);
  template <typename _Functor>
  using _Callable = __and_<__check_func_return_type<_Invoke<_Functor>, _Res>>;
  template <typename, typename> using _Requires = int;

public:
  template <typename _Functor, typename = _Requires<_Callable<_Functor>, void>>
  function(_Functor);
  using _Invoker_type = _Res (*)(const int &);
  _Invoker_type _M_invoker;
};
template <typename _Res, typename... _ArgTypes>
template <typename _Functor, typename>
function<_Res(_ArgTypes...)>::function(_Functor) {
  _M_invoker = _Function_handler<_Res(), _Functor>::_M_invoke;
}
class unique_ptr {
public:
  ~unique_ptr();
};
template <typename _Tp, typename... _Args> _Tp make_unique(_Args... __args) {
  _Tp(__args...);
}
}
class A {
public:
  template <class T> T as();
};
class variables_map {
public:
  A operator[](std::basic_string);
};
class B {
public:
  variables_map configuration();
  void run(int, int, std::function<void()>);
};
class H;
struct G {
  enum {} _state;
};
class D {
  G _local_state;
  std::unique_ptr _task;
  template <typename Func> void schedule(Func func) {
    struct task_with_state {
      task_with_state(Func func) : _func(func) {}
      Func _func;
    } tws = std::make_unique<task_with_state>(std::move(func));
  }
  friend H;
};
template <typename> using futurize_t = H;
class H {
  D *_promise;
  template <typename Func> void schedule(Func func) {
    G __trans_tmp_1;
    struct task_with_ready_state {
      task_with_ready_state(Func, G) { };
    };
    std::make_unique<task_with_ready_state>(std::move(func), __trans_tmp_1);
    _promise->schedule(std::move(func));
  }
  template <typename Func, typename Param> void then(Func func, Param) {
    using P = D;
    P pr;
    schedule([ pr = std::move(pr), func, param = std::forward<Param> ]{});
  }

public:
  template <typename Func> futurize_t<std::result_of_t<Func()>> then(Func) {
    then(0, [] {});
  }
} clients;
int main() {
  B app;
  app.run(0, 0, [&] {
    auto config = app.configuration()[0].as<std::string>();
    clients.then([] {});
  });

  return 0;
}