//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++98, c++03 // // unique_ptr // Test unique_ptr converting move ctor #include #include #include "test_macros.h" #include "deleter_types.h" #include "unique_ptr_test_helper.h" template struct GenericDeleter { void operator()(void*) const {} }; template struct GenericConvertingDeleter { template GenericConvertingDeleter(GenericConvertingDeleter) {} void operator()(void*) const {} }; void test_sfinae() { { // Disallow copying using U1 = std::unique_ptr >; using U2 = std::unique_ptr >; static_assert(std::is_constructible::value, ""); static_assert(!std::is_constructible::value, ""); static_assert(!std::is_constructible::value, ""); static_assert(!std::is_constructible::value, ""); } { // Disallow illegal qualified conversions using U1 = std::unique_ptr; using U2 = std::unique_ptr; static_assert(std::is_constructible::value, ""); static_assert(!std::is_constructible::value, ""); } { // Disallow base-to-derived conversions. using UA = std::unique_ptr; using UB = std::unique_ptr; static_assert(!std::is_constructible::value, ""); } { // Disallow base-to-derived conversions. using UA = std::unique_ptr >; using UB = std::unique_ptr >; static_assert(!std::is_constructible::value, ""); } { // Disallow invalid deleter initialization using U1 = std::unique_ptr >; using U2 = std::unique_ptr >; static_assert(!std::is_constructible::value, ""); } { // Disallow reference deleters with different qualifiers using U1 = std::unique_ptr&>; using U2 = std::unique_ptr&>; static_assert(!std::is_constructible::value, ""); static_assert(!std::is_constructible::value, ""); } { using U1 = std::unique_ptr; using U2 = std::unique_ptr; static_assert(!std::is_constructible::value, ""); static_assert(!std::is_constructible::value, ""); } } int main(int, char**) { test_sfinae(); return 0; }