diff --git a/libcxx/include/memory b/libcxx/include/memory index 34c3e0c0d8d1e6..821f371eb0b047 100644 --- a/libcxx/include/memory +++ b/libcxx/include/memory @@ -1695,7 +1695,7 @@ struct _LIBCPP_TEMPLATE_VIS allocator_traits static typename enable_if < - is_trivially_move_constructible<_DestTp>::value && + is_trivially_copy_constructible<_DestTp>::value && is_same<_RawSourceTp, _RawDestTp>::value && (__is_default_allocator::value || !__has_construct::value), diff --git a/libcxx/test/std/containers/sequences/vector/vector.cons/copy.move_only.fail.cpp b/libcxx/test/std/containers/sequences/vector/vector.cons/copy.move_only.fail.cpp new file mode 100644 index 00000000000000..b38f24c3be2547 --- /dev/null +++ b/libcxx/test/std/containers/sequences/vector/vector.cons/copy.move_only.fail.cpp @@ -0,0 +1,28 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +// Make sure that a std::vector containing move-only types can't be copied. + +// UNSUPPORTED: c++98, c++03 +// REQUIRES: verify-support + +#include + +struct move_only +{ + move_only() = default; + move_only(move_only&&) = default; + move_only& operator=(move_only&&) = default; +}; + +int main(int, char**) +{ + std::vector v; + std::vector copy = v; // expected-error@memory:* {{call to implicitly-deleted copy constructor of 'move_only'}} + return 0; +}