//===----------------------------------------------------------------------===// // // 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 // //===----------------------------------------------------------------------===// // // implicitly generated array constructors / assignment operators #include #include #include #include "test_macros.h" // In C++03 the copy assignment operator is not deleted when the implicitly // generated operator would be ill-formed; like in the case of a struct with a // const member. #if TEST_STD_VER < 11 # define TEST_NOT_COPY_ASSIGNABLE(T) ((void)0) #else # define TEST_NOT_COPY_ASSIGNABLE(T) static_assert(!std::is_copy_assignable::value, "") #endif struct NoDefault { TEST_CONSTEXPR NoDefault(int) { } }; struct NonTrivialCopy { TEST_CONSTEXPR NonTrivialCopy() { } TEST_CONSTEXPR NonTrivialCopy(NonTrivialCopy const&) { } TEST_CONSTEXPR_CXX14 NonTrivialCopy& operator=(NonTrivialCopy const&) { return *this; } }; TEST_CONSTEXPR_CXX14 bool tests() { { typedef std::array Array; Array array = {1.1, 2.2, 3.3}; Array copy = array; copy = array; static_assert(std::is_copy_constructible::value, ""); static_assert(std::is_copy_assignable::value, ""); } { typedef std::array Array; Array array = {1.1, 2.2, 3.3}; Array copy = array; (void)copy; static_assert(std::is_copy_constructible::value, ""); TEST_NOT_COPY_ASSIGNABLE(Array); } { typedef std::array Array; Array array = {}; Array copy = array; copy = array; static_assert(std::is_copy_constructible::value, ""); static_assert(std::is_copy_assignable::value, ""); } { // const arrays of size 0 should disable the implicit copy assignment operator. typedef std::array Array; Array array = {}; Array copy = array; (void)copy; static_assert(std::is_copy_constructible::value, ""); TEST_NOT_COPY_ASSIGNABLE(Array); } { typedef std::array Array; Array array = {}; Array copy = array; copy = array; static_assert(std::is_copy_constructible::value, ""); static_assert(std::is_copy_assignable::value, ""); } { typedef std::array Array; Array array = {}; Array copy = array; (void)copy; static_assert(std::is_copy_constructible::value, ""); TEST_NOT_COPY_ASSIGNABLE(Array); } // Make sure we can implicitly copy a std::array of a non-trivially copyable type { typedef std::array Array; Array array = {}; Array copy = array; copy = array; static_assert(std::is_copy_constructible::value, ""); } { typedef std::array Array; Array array = {}; Array copy = array; copy = array; static_assert(std::is_copy_constructible::value, ""); } { typedef std::array Array; Array array = {}; Array copy = array; copy = array; static_assert(std::is_copy_constructible::value, ""); } return true; } int main(int, char**) { tests(); #if TEST_STD_VER >= 14 static_assert(tests(), ""); #endif return 0; }