Mercurial > hg > CbC > CbC_gcc
view gcc/testsuite/g++.dg/cpp0x/variadic143.C @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children |
line wrap: on
line source
// PR c++/56782 // { dg-do compile { target c++11 } } template<class T> T&& declval(); struct is_convertible_impl { template<class T> static void sink(T); template<class T, class U, class = decltype(sink<U>(declval<T>()))> static auto test(int) -> char; template<class, class> static auto test(...) -> char(&)[2]; }; template<class T, class U> struct is_convertible : is_convertible_impl { static const bool value = sizeof(test<T, U>(0)) == 1; }; template<bool, class> struct enable_if {}; template<class T> struct enable_if<true, T> { typedef T type; }; template<bool, class If, class Else> struct conditional { typedef If type; }; template<class If, class Else> struct conditional<false, If, Else> { typedef Else type; }; template<class...> struct and_; template<> struct and_<> { static const bool value = true; }; template<class P> struct and_<P> : P { }; template<class P1, class P2> struct and_<P1, P2> : conditional<P1::value, P2, P1>::type { }; template<class... T> struct Tuple { template<class... U, class = typename enable_if<and_<is_convertible<U, T>... >::value, int>::type > Tuple(U&&...){} }; static_assert(is_convertible<Tuple<>, Tuple<>>::value, "Ouch"); //#1