blob: 928e60094a32a3dc49bed73fd5195e2eaa99b4e6 [file] [log] [blame]
// { dg-do compile { target c++23 } }
// { dg-add-options no_pch }
#include <utility>
#ifndef __cpp_lib_forward_like
# error "Feature-test macro for forward_like missing in <utility>"
#elif __cpp_lib_forward_like != 202207L
# error "Feature-test macro for forward_like has wrong value in <utility>"
#endif
template<typename T, typename U>
using forward_like_t = decltype(std::forward_like<T>(std::declval<U>()));
#if 0
using std::is_same_v;
#else
#include <concepts>
template<class T, class U> concept is_same_v = std::same_as<T, U>;
#endif
static_assert( is_same_v<forward_like_t<int, long>, long&&> );
static_assert( is_same_v<forward_like_t<int&, long>, long&> );
static_assert( is_same_v<forward_like_t<int&&, long>, long&&> );
static_assert( is_same_v<forward_like_t<const int, long>, const long&&> );
static_assert( is_same_v<forward_like_t<const int&, long>, const long&> );
static_assert( is_same_v<forward_like_t<const int&&, long>, const long&&> );
static_assert( is_same_v<forward_like_t<int, const long>, const long&&> );
static_assert( is_same_v<forward_like_t<int&, const long>, const long&> );
static_assert( is_same_v<forward_like_t<int&&, const long>, const long&&> );
static_assert( is_same_v<forward_like_t<const int, long&>, const long&&> );
static_assert( is_same_v<forward_like_t<const int&, long&>, const long&> );
static_assert( is_same_v<forward_like_t<const int&&, long&>, const long&&> );
static_assert( is_same_v<forward_like_t<int, const long&>, const long&&> );
static_assert( is_same_v<forward_like_t<int&, const long&>, const long&> );
static_assert( is_same_v<forward_like_t<int&&, const long&>, const long&&> );
static_assert( is_same_v<forward_like_t<const int, long&&>, const long&&> );
static_assert( is_same_v<forward_like_t<const int&, long&&>, const long&> );
static_assert( is_same_v<forward_like_t<const int&&, long&&>, const long&&> );
static_assert( is_same_v<forward_like_t<int, const long&&>, const long&&> );
static_assert( is_same_v<forward_like_t<int&, const long&&>, const long&> );
static_assert( is_same_v<forward_like_t<int&&, const long&&>, const long&&> );
static_assert( is_same_v<forward_like_t<volatile int, long>, long&&> );
static_assert( is_same_v<forward_like_t<volatile int&, long>, long&> );
static_assert( is_same_v<forward_like_t<volatile int&&, long>, long&&> );
static_assert( is_same_v<forward_like_t<const int, volatile long>,
const volatile long&&> );
static_assert( is_same_v<forward_like_t<const int&, volatile long>,
const volatile long&> );
static_assert( is_same_v<forward_like_t<const int&&, volatile long>,
const volatile long&&> );