// PR c++/63885 // { dg-do compile { target c++11 } } template struct remove_reference { typedef T type; }; template struct remove_reference { typedef T type; }; template struct remove_reference { typedef T type; }; template struct is_lvalue_reference { static const bool value = false; }; template struct is_lvalue_reference { static const bool value = true; }; template struct conditional; template struct conditional { typedef U type; }; template struct conditional { typedef V type; }; template constexpr _Tp&& forward(typename remove_reference<_Tp>::type& __t) noexcept { return static_cast<_Tp&&>(__t); } /////////////////////////////////////////////////////////////////////////////// template struct member_forward { typedef typename remove_reference ::type::type T; typedef typename conditional < is_lvalue_reference ::value, T&, T >::type type; }; template using member_forward_t = typename member_forward ::type; /////////////////////////////////////////////////////////////////////////////// template struct __get; template < typename T> struct __get <0, T> { constexpr static auto value (T arg) -> decltype ((forward > (arg.t))) { return forward > (arg.t); } }; template constexpr auto get (T && arg) -> decltype (__get ::value (forward (arg))) { return __get ::value (forward (arg)); } /////////////////////////////////////////////////////////////////////////////// template struct S { typedef T type; T t; template constexpr S (U && u) : t (forward (u)) {} }; static_assert (get <0> (S (1)) == 1, ""); // g++ 4.9 passes, g++ trunk r217559 fails