diff options
Diffstat (limited to 'libcxx/test/std/utilities/utility/utility.inplace/inplace.pass.cpp')
-rw-r--r-- | libcxx/test/std/utilities/utility/utility.inplace/inplace.pass.cpp | 91 |
1 files changed, 33 insertions, 58 deletions
diff --git a/libcxx/test/std/utilities/utility/utility.inplace/inplace.pass.cpp b/libcxx/test/std/utilities/utility/utility.inplace/inplace.pass.cpp index 0cf8e38f5ab..e87c6f399e9 100644 --- a/libcxx/test/std/utilities/utility/utility.inplace/inplace.pass.cpp +++ b/libcxx/test/std/utilities/utility/utility.inplace/inplace.pass.cpp @@ -11,21 +11,24 @@ // <utility> -// struct in_place_tag { in_place_tag() = delete; }; -// -// using in_place_t = in_place_tag(&)(unspecified); +// struct in_place_t { +// explicit in_place_t() = default; +// }; +// inline constexpr in_place_t in_place{}; + // template <class T> -// using in_place_type_t = in_place_tag(&)(unspecified<T>); -// template <size_t N> -// using in_place_index_t = in_place_tag(&)(unspecified<N>); -// -// in_place_tag in_place(unspecified); -// -// template <class T>; -// in_place_tag in_place(unspecified<T>); -// -// template <size_t N> -// in_place_tag in_place(unspecified<N>); +// struct in_place_type_t { +// explicit in_place_type_t() = default; +// }; +// template <class T> +// inline constexpr in_place_type_t<T> in_place_type{}; + +// template <size_t I> +// struct in_place_index_t { +// explicit in_place_index_t() = default; +// }; +// template <size_t I> +// inline constexpr in_place_index_t<I> in_place_index{}; #include <utility> #include <cassert> @@ -34,66 +37,38 @@ #include "test_macros.h" #include "type_id.h" -template <class Tp> -struct CheckRet : std::false_type {}; -template <class Arg> -struct CheckRet<std::in_place_tag(Arg)> : std::true_type {}; - -TypeID const* test_fn(std::in_place_t) { return &makeTypeID<std::in_place_t>(); } -template <class T> -TypeID const* test_fn(std::in_place_type_t<T>) -{ return &makeTypeID<std::in_place_type_t<T>>(); } - -template <size_t I> -TypeID const* test_fn(std::in_place_index_t<I>) -{ return &makeTypeID<std::in_place_index_t<I>>(); } - -// Concrete test overloads that don't have to be deduced. -template <class Tag> -TypeID const* concrete_test_fn(Tag) { return &makeTypeID<Tag>(); } - -template <class Tp> -bool check_tag_basic() { - using RawTp = typename std::remove_reference<Tp>::type; - static_assert(std::is_lvalue_reference<Tp>::value, ""); - static_assert(std::is_function<RawTp>::value, ""); - static_assert(CheckRet<RawTp>::value, ""); - auto concrete_fn = concrete_test_fn<Tp>; - return test_fn((Tp)std::in_place) == &makeTypeID<Tp>() - && concrete_fn(std::in_place) == &makeTypeID<Tp>(); +template <class Tp, class Up> +constexpr bool check_tag(Up) { + return std::is_same<Tp, std::decay_t<Tp>>::value + && std::is_same<Tp, Up>::value; } int main() { - // test in_place_tag - { - static_assert(!std::is_default_constructible<std::in_place_tag>::value, ""); - } // test in_place_t { using T = std::in_place_t; - assert(check_tag_basic<std::in_place_t>()); - assert(test_fn((T)std::in_place) == &makeTypeID<T>()); + static_assert(check_tag<T>(std::in_place)); } // test in_place_type_t { using T1 = std::in_place_type_t<void>; using T2 = std::in_place_type_t<int>; using T3 = std::in_place_type_t<const int>; - assert(check_tag_basic<T1>()); - assert(check_tag_basic<T2>()); - assert(check_tag_basic<T3>()); - static_assert(!std::is_same<T1, T2>::value && !std::is_same<T1, T3>::value, ""); - static_assert(!std::is_same<T2, T3>::value, ""); + static_assert(!std::is_same<T1, T2>::value && !std::is_same<T1, T3>::value); + static_assert(!std::is_same<T2, T3>::value); + static_assert(check_tag<T1>(std::in_place_type<void>)); + static_assert(check_tag<T2>(std::in_place_type<int>)); + static_assert(check_tag<T3>(std::in_place_type<const int>)); } // test in_place_index_t { using T1 = std::in_place_index_t<0>; using T2 = std::in_place_index_t<1>; using T3 = std::in_place_index_t<static_cast<size_t>(-1)>; - assert(check_tag_basic<T1>()); - assert(check_tag_basic<T2>()); - assert(check_tag_basic<T3>()); - static_assert(!std::is_same<T1, T2>::value && !std::is_same<T1, T3>::value, ""); - static_assert(!std::is_same<T2, T3>::value, ""); + static_assert(!std::is_same<T1, T2>::value && !std::is_same<T1, T3>::value); + static_assert(!std::is_same<T2, T3>::value); + static_assert(check_tag<T1>(std::in_place_index<0>)); + static_assert(check_tag<T2>(std::in_place_index<1>)); + static_assert(check_tag<T3>(std::in_place_index<static_cast<size_t>(-1)>)); } -}
\ No newline at end of file +} |