//===----------------------------------------------------------------------===// // // 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 // // struct in_place_tag { in_place_tag() = delete; }; // // using in_place_t = in_place_tag(&)(unspecified); // template // using in_place_type_t = in_place_tag(&)(unspecified); // template // using in_place_index_t = in_place_tag(&)(unspecified); // // in_place_tag in_place(unspecified); // // template ; // in_place_tag in_place(unspecified); // // template // in_place_tag in_place(unspecified); #include #include #include #include "test_macros.h" #include "type_id.h" template struct CheckRet : std::false_type {}; template struct CheckRet : std::true_type {}; TypeID const* test_fn(std::in_place_t) { return &makeTypeID(); } template TypeID const* test_fn(std::in_place_type_t) { return &makeTypeID>(); } template TypeID const* test_fn(std::in_place_index_t) { return &makeTypeID>(); } // Concrete test overloads that don't have to be deduced. template TypeID const* concrete_test_fn(Tag) { return &makeTypeID(); } template bool check_tag_basic() { using RawTp = typename std::remove_reference::type; static_assert(std::is_lvalue_reference::value, ""); static_assert(std::is_function::value, ""); static_assert(CheckRet::value, ""); auto concrete_fn = concrete_test_fn; return test_fn((Tp)std::in_place) == &makeTypeID() && concrete_fn(std::in_place) == &makeTypeID(); } int main() { // test in_place_tag { static_assert(!std::is_default_constructible::value, ""); } // test in_place_t { using T = std::in_place_t; assert(check_tag_basic()); assert(test_fn((T)std::in_place) == &makeTypeID()); } // test in_place_type_t { using T1 = std::in_place_type_t; using T2 = std::in_place_type_t; using T3 = std::in_place_type_t; assert(check_tag_basic()); assert(check_tag_basic()); assert(check_tag_basic()); static_assert(!std::is_same::value && !std::is_same::value, ""); static_assert(!std::is_same::value, ""); } // 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(-1)>; assert(check_tag_basic()); assert(check_tag_basic()); assert(check_tag_basic()); static_assert(!std::is_same::value && !std::is_same::value, ""); static_assert(!std::is_same::value, ""); } }