https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89130
Bug ID: 89130 Summary: [9 Regression] std::vector relocation fails for types with deleted move constructor Product: gcc Version: 9.0 Status: UNCONFIRMED Keywords: rejects-valid Severity: normal Priority: P3 Component: libstdc++ Assignee: redi at gcc dot gnu.org Reporter: redi at gcc dot gnu.org Target Milestone: --- #include <vector> struct X { X() { } X(const X&) { } X(X&&) = delete; }; int main() { const X x; std::vector<X> v; v.push_back(x); } In file included from /home/jwakely/gcc/9/include/c++/9.0.1/x86_64-pc-linux-gnu/bits/c++allocator.h:33, from /home/jwakely/gcc/9/include/c++/9.0.1/bits/allocator.h:46, from /home/jwakely/gcc/9/include/c++/9.0.1/vector:64, from del.cc:7: /home/jwakely/gcc/9/include/c++/9.0.1/ext/new_allocator.h: In instantiation of 'void __gnu_cxx::new_allocator<_Tp>::construct(_Up*, _Args&& ...) [with _Up = X; _Args = {X}; _Tp = X]': /home/jwakely/gcc/9/include/c++/9.0.1/bits/alloc_traits.h:482:2: required from 'static void std::allocator_traits<std::allocator<_Tp1> >::construct(std::allocator_traits<std::allocator<_Tp1> >::allocator_type&, _Up*, _Args&& ...) [with _Up = X; _Args = {X}; _Tp = X; std::allocator_traits<std::allocator<_Tp1> >::allocator_type = std::allocator<X>]' /home/jwakely/gcc/9/include/c++/9.0.1/bits/stl_uninitialized.h:888:67: required from 'void std::__relocate_object_a(_Tp*, _Up*, _Allocator&) [with _Tp = X; _Up = X; _Allocator = std::allocator<X>]' /home/jwakely/gcc/9/include/c++/9.0.1/bits/stl_uninitialized.h:919:47: required from '_ForwardIterator std::__relocate_a_1(_InputIterator, _InputIterator, _ForwardIterator, _Allocator&) [with _InputIterator = X*; _ForwardIterator = X*; _Allocator = std::allocator<X>]' /home/jwakely/gcc/9/include/c++/9.0.1/bits/stl_uninitialized.h:940:37: required from '_ForwardIterator std::__relocate_a(_InputIterator, _InputIterator, _ForwardIterator, _Allocator&) [with _InputIterator = X*; _ForwardIterator = X*; _Allocator = std::allocator<X>]' /home/jwakely/gcc/9/include/c++/9.0.1/bits/stl_vector.h:430:35: required from 'static constexpr bool std::vector<_Tp, _Alloc>::_S_use_relocate() [with _Tp = X; _Alloc = std::allocator<X>]' /home/jwakely/gcc/9/include/c++/9.0.1/bits/vector.tcc:460:33: required from 'void std::vector<_Tp, _Alloc>::_M_realloc_insert(std::vector<_Tp, _Alloc>::iterator, _Args&& ...) [with _Args = {const X&}; _Tp = X; _Alloc = std::allocator<X>; std::vector<_Tp, _Alloc>::iterator = __gnu_cxx::__normal_iterator<X*, std::vector<X> >; typename std::_Vector_base<_Tp, _Alloc>::pointer = X*]' /home/jwakely/gcc/9/include/c++/9.0.1/bits/stl_vector.h:1162:4: required from 'void std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = X; _Alloc = std::allocator<X>; std::vector<_Tp, _Alloc>::value_type = X]' del.cc:13:16: required from here /home/jwakely/gcc/9/include/c++/9.0.1/ext/new_allocator.h:145:20: error: use of deleted function 'X::X(X&&)' 145 | noexcept(noexcept(::new((void *)__p) | ^~~~~~~~~~~~~~~~~~ 146 | _Up(std::forward<_Args>(__args)...))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ del.cc:4:3: note: declared here 4 | X(X&&) = delete; | ^