Mercurial > hg > CbC > CbC_gcc
comparison gcc/testsuite/g++.dg/torture/pr70971.C @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
111:04ced10e8804 | 131:84e7813d76e9 |
---|---|
1 // { dg-additional-options "-std=c++14 -Wno-return-type" } | |
2 | |
3 template<typename Signature> | |
4 class function; | |
5 | |
6 template<typename R, typename... Args> | |
7 class invoker_base | |
8 { | |
9 public: | |
10 virtual ~invoker_base() { } | |
11 }; | |
12 | |
13 template<typename F, typename R, typename... Args> | |
14 class functor_invoker : public invoker_base<R, Args...> | |
15 { | |
16 public: | |
17 explicit functor_invoker(const F& f) : f(f) { } | |
18 private: | |
19 F f; | |
20 }; | |
21 | |
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; | |
35 }; | |
36 | |
37 template<typename> | |
38 struct unique_ptr { }; | |
39 | |
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{})...}; | |
47 } | |
48 main() { chooseB(typelist<double, char>{}, 0, 1, 2); } |