Mercurial > hg > CbC > CbC_gcc
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gcc/testsuite/g++.dg/torture/pr70971.C Thu Oct 25 07:37:49 2018 +0900 @@ -0,0 +1,48 @@ +// { dg-additional-options "-std=c++14 -Wno-return-type" } + +template<typename Signature> +class function; + +template<typename R, typename... Args> +class invoker_base +{ + public: + virtual ~invoker_base() { } +}; + +template<typename F, typename R, typename... Args> +class functor_invoker : public invoker_base<R, Args...> +{ + public: + explicit functor_invoker(const F& f) : f(f) { } + private: + F f; +}; + +template<typename R, typename... Args> +class function<R (Args...)> { + public: + template<typename F> + function(const F& f) : invoker(0) { + invoker = new functor_invoker<F, R, Args...>(f); + } + ~function() { + if (invoker) + delete invoker; + } + private: + invoker_base<R, Args...>* invoker; +}; + +template<typename> +struct unique_ptr { }; + +struct A {}; +template <class...> struct typelist {}; +template <class... Cs> unique_ptr<A> chooseB(typelist<Cs...>); +template <class... Cs, class Idx, class... Rest> +unique_ptr<A> chooseB(typelist<Cs...> choices, Idx, Rest... rest) { + auto f = [=](auto) { return [=] { return chooseB(choices, rest...); }; }; + function<unique_ptr<A>()> fs[]{f(Cs{})...}; +} +main() { chooseB(typelist<double, char>{}, 0, 1, 2); }