Index: libcxx/include/__memory/uninitialized_algorithms.h =================================================================== --- libcxx/include/__memory/uninitialized_algorithms.h +++ libcxx/include/__memory/uninitialized_algorithms.h @@ -573,7 +573,7 @@ __enable_if_t< // using _RawTypeIn because of the allocator extension is_trivially_copy_constructible<_RawTypeIn>::value && is_trivially_copy_assignable<_RawTypeIn>::value && - is_same<__remove_cv_t<_In>, __remove_cv_t<_Out> >::value && + is_same<__remove_const_t<_In>, __remove_const_t<_Out> >::value && __allocator_has_trivial_copy_construct<_Alloc, _RawTypeIn>::value>* = nullptr> _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _Out* __uninitialized_allocator_copy_impl(_Alloc&, _In* __first1, _In* __last1, _Out* __first2) { Index: libcxx/test/std/containers/sequences/vector/vector.cons/copy.pass.cpp =================================================================== --- libcxx/test/std/containers/sequences/vector/vector.cons/copy.pass.cpp +++ libcxx/test/std/containers/sequences/vector/vector.cons/copy.pass.cpp @@ -100,11 +100,20 @@ return true; } +void test_copy_from_volatile_src() { + volatile int src[] = {1, 2, 3}; + std::vector v(src, src + 3); + assert(v[0] == 1); + assert(v[1] == 2); + assert(v[2] == 3); +} + int main(int, char**) { tests(); #if TEST_STD_VER > 17 static_assert(tests()); #endif + test_copy_from_volatile_src(); return 0; }