| //===----------------------------------------------------------------------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is dual licensed under the MIT and the University of Illinois Open |
| // Source Licenses. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| // UNSUPPORTED: c++98, c++03, c++11, c++14 |
| |
| // <utility> |
| |
| // struct in_place_t { |
| // explicit in_place_t() = default; |
| // }; |
| // inline constexpr in_place_t in_place{}; |
| |
| // template <class T> |
| // 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> |
| #include <memory> |
| |
| #include "test_macros.h" |
| #include "type_id.h" |
| |
| 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_t |
| { |
| using T = std::in_place_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>; |
| 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)>; |
| 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)>)); |
| } |
| } |