blob: f59cd845304278c5f9c76a699e487acd6f893bf7 [file] [log] [blame]
// PR c++/53202
// { dg-do run { target c++11 } }
#include <tuple>
template<typename Callable>
struct Bind_simple
{
explicit
Bind_simple(const Callable& callable)
: _M_bound(callable)
{ }
Bind_simple(const Bind_simple&) = default;
Bind_simple(Bind_simple&&) = default;
auto operator()() -> decltype((*(Callable*)0)())
{
return std::get<0>(_M_bound)();
}
private:
std::tuple<Callable> _M_bound;
};
template<typename Callable>
Bind_simple<Callable>
bind_simple(Callable& callable)
{
return Bind_simple<Callable>(callable);
}
struct thread
{
struct ImplBase { };
template<typename T>
struct Impl : ImplBase {
T t;
Impl(T&& t) : t(std::move(t)) { }
};
template<typename T>
thread(T& t)
{
auto p = make_routine(bind_simple(t));
p->t();
delete p;
}
template<typename Callable>
Impl<Callable>*
make_routine(Callable&& f)
{
return new Impl<Callable>(std::forward<Callable>(f));
}
};
int c;
class background_hello
{
public:
background_hello()
{
__builtin_printf("default ctor called, this=%p\n", this);
++c;
}
background_hello(const background_hello &)
{
__builtin_printf("copy ctor called\n");
++c;
}
background_hello(background_hello &&)
{
__builtin_printf("move ctor called\n");
++c;
}
void operator ()() const
{
__builtin_printf("void background_hello::operator()() called, this=%p\n", this);
}
~background_hello()
{
__builtin_printf("destructor called, this=%p\n", this);
--c;
}
};
int main()
{
{
background_hello bh;
thread t(bh);
}
if (c != 0)
__builtin_abort ();
}