strub: enable conditional support
[official-gcc.git] / gcc / testsuite / g++.dg / torture / pr70971.C
blobb4ce235110f445c377ada44866dc198fa8ed4634
1 // { dg-additional-options "-std=c++14 -Wno-return-type" }
3 template<typename Signature>
4 class function;
6 template<typename R, typename... Args>
7 class invoker_base
9  public:
10   virtual ~invoker_base() { }
13 template<typename F, typename R, typename... Args>
14 class functor_invoker : public invoker_base<R, Args...>
16  public:
17   explicit functor_invoker(const F& f) : f(f) { }
18  private:
19   F f;
22 template<typename R, typename... Args>
23 class function<R (Args...)> {
24  public:
25   template<typename F>
26   function(const F& f) : invoker(0) {
27     invoker = new functor_invoker<F, R, Args...>(f); 
28   }
29   ~function() {
30     if (invoker)
31       delete invoker;
32   }
33  private:
34   invoker_base<R, Args...>* invoker;
37 template<typename>
38 struct unique_ptr { };
40 struct A {};
41 template <class...> struct typelist {};
42 template <class... Cs> unique_ptr<A> chooseB(typelist<Cs...>);
43 template <class... Cs, class Idx, class... Rest>
44 unique_ptr<A> chooseB(typelist<Cs...> choices, Idx, Rest... rest) {
45   auto f = [=](auto) { return [=] { return chooseB(choices, rest...); }; };
46   function<unique_ptr<A>()> fs[]{f(Cs{})...};
48 main() { chooseB(typelist<double, char>{}, 0, 1, 2); }