annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1 // { dg-additional-options "-std=c++14 -Wno-return-type" }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
2
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
3 template<typename Signature>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4 class function;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6 template<typename R, typename... Args>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7 class invoker_base
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10 virtual ~invoker_base() { }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13 template<typename F, typename R, typename... Args>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 class functor_invoker : public invoker_base<R, Args...>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17 explicit functor_invoker(const F& f) : f(f) { }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18 private:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19 F f;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22 template<typename R, typename... Args>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23 class function<R (Args...)> {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25 template<typename F>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26 function(const F& f) : invoker(0) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27 invoker = new functor_invoker<F, R, Args...>(f);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29 ~function() {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30 if (invoker)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31 delete invoker;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 private:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34 invoker_base<R, Args...>* invoker;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37 template<typename>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38 struct unique_ptr { };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40 struct A {};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41 template <class...> struct typelist {};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
42 template <class... Cs> unique_ptr<A> chooseB(typelist<Cs...>);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43 template <class... Cs, class Idx, class... Rest>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44 unique_ptr<A> chooseB(typelist<Cs...> choices, Idx, Rest... rest) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45 auto f = [=](auto) { return [=] { return chooseB(choices, rest...); }; };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46 function<unique_ptr<A>()> fs[]{f(Cs{})...};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48 main() { chooseB(typelist<double, char>{}, 0, 1, 2); }