// { dg-do compile { target c++11 } } #include template constexpr bool check() { return std::is_same(std::declval())), T>::value; } void test_value_category() { using P = std::pair; static_assert( check<0, int&, P&>(), "get<0>(pair&)" ); static_assert( check<1, long&, P&>(), "get<1>(pair&)" ); static_assert( check<0, int&&, P&&>(), "get<0>(pair&&)" ); static_assert( check<1, long&&, P&&>(), "get<1>(pair&&)" ); static_assert( check<0, const int&, const P&>(), "get<0>(const pair&)" ); static_assert( check<1, const long&, const P&>(), "get<1>(const pair&)" ); static_assert( check<0, const int&&, const P&&>(), "get<0>(const pair&&)" ); static_assert( check<1, const long&&, const P&&>(), "get<1>(const pair&&)" ); using PL = std::pair; static_assert( check<0, int&, PL&>(), "get<0>(pair&)" ); static_assert( check<1, long&, PL&>(), "get<1>(pair&)" ); static_assert( check<0, int&, PL&&>(), "get<0>(pair&&)" ); static_assert( check<1, long&, PL&&>(), "get<1>(pair&&)" ); static_assert( check<0, int&, const PL&>(), "get<0>(const pair&)" ); static_assert( check<1, long&, const PL&>(), "get<1>(const pair&)" ); static_assert( check<0, int&, const PL&&>(), "get<0>(const pair&&)" ); static_assert( check<1, long&, const PL&&>(), "get<1>(const pair&&)" ); using PR = std::pair; static_assert( check<0, int&, P&>(), "get<0>(pair&)" ); static_assert( check<1, long&, P&>(), "get<1>(pair&)" ); static_assert( check<0, int&&, PR&&>(), "get<0>(pair&&)" ); static_assert( check<1, long&&, PR&&>(), "get<1>(pair&&)" ); static_assert( check<0, int&, const PR&>(), "get<0>(const pair&)" ); static_assert( check<1, long&, const PR&>(), "get<1>(const pair&)" ); static_assert( check<0, int&&, const PR&&>(), "get<0>(const pair&&)" ); static_assert( check<1, long&&, const PR&&>(), "get<1>(const pair&&)" ); }