1 // PR c++/67130 2 // { dg-do compile { target c++14 } } 3 4 namespace std { 5 template <typename> struct __success_type; 6 template <typename> void declval(); 7 template <typename> class decay { 8 public: 9 typedef int type; 10 }; 11 template <typename...> struct common_type; 12 struct A { 13 template <typename, typename _Up> 14 static __success_type<typename decay<decltype(declval<_Up>)>::type> _S_test; 15 }; 16 template <typename _Tp, typename _Up> struct __common_type_impl : A { 17 typedef decltype(_S_test<_Tp, _Up>) type; 18 }; 19 template <typename _Tp, typename _Up> 20 struct common_type<_Tp, _Up> : __common_type_impl<_Tp, _Up> {}; 21 } 22 template <typename> struct B { struct _; }; 23 template <typename T> typename B<T>::_ type; 24 template <template <typename...> class> struct C; 25 template <template <typename...> class f> C<f> metafunction; 26 template <typename T> struct B<T>::_ {}; 27 namespace detail { 28 template <typename> struct _decltype; 29 } 30 template <template <typename...> class F> struct C { 31 template <typename... T> 32 auto operator()(T...) 33 -> decltype(type<typename F<detail::_decltype<T>...>::type>); 34 }; 35 auto common_type = metafunction<std::common_type>(0, 0); 36