https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65279

            Bug ID: 65279
           Summary: [4.8/4.9/5 Regression] std::scoped_allocator_adaptor
                    is not assignable
           Product: gcc
           Version: 5.0
            Status: UNCONFIRMED
          Keywords: rejects-valid
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: redi at gcc dot gnu.org

#include <memory>
#include <scoped_allocator>
#include <vector>

int main()
{
  std::vector<int, std::scoped_allocator_adaptor<std::allocator<int>>> v, w;
  w = std::move(v);
}

This compiles OK (using -std=c++11) with 4.7 but not 4.8 or later:

In file included from
/home/jwakely/gcc/4.8.0/include/c++/4.8.0/ext/alloc_traits.h:36:0,
                 from
/home/jwakely/gcc/4.8.0/include/c++/4.8.0/bits/stl_construct.h:61,
                 from /home/jwakely/gcc/4.8.0/include/c++/4.8.0/memory:64,
                 from saa.cc:1:
/home/jwakely/gcc/4.8.0/include/c++/4.8.0/bits/alloc_traits.h: In instantiation
of ‘void std::__do_alloc_on_move(_Alloc&, _Alloc&, std::true_type) [with _Alloc
= std::scoped_allocator_adaptor<std::allocator<int> >; std::true_type =
std::integral_constant<bool, true>]’:
/home/jwakely/gcc/4.8.0/include/c++/4.8.0/bits/alloc_traits.h:490:49:  
required from ‘void std::__alloc_on_move(_Alloc&, _Alloc&) [with _Alloc =
std::scoped_allocator_adaptor<std::allocator<int> >]’
/home/jwakely/gcc/4.8.0/include/c++/4.8.0/bits/stl_vector.h:1364:36:   required
from ‘void std::vector<_Tp, _Alloc>::_M_move_assign(std::vector<_Tp, _Alloc>&&,
std::true_type) [with _Tp = int; _Alloc =
std::scoped_allocator_adaptor<std::allocator<int> >; std::true_type =
std::integral_constant<bool, true>]’
/home/jwakely/gcc/4.8.0/include/c++/4.8.0/bits/stl_vector.h:445:65:   required
from ‘std::vector<_Tp, _Alloc>& std::vector<_Tp,
_Alloc>::operator=(std::vector<_Tp, _Alloc>&&) [with _Tp = int; _Alloc =
std::scoped_allocator_adaptor<std::allocator<int> >]’
saa.cc:8:5:   required from here
/home/jwakely/gcc/4.8.0/include/c++/4.8.0/bits/alloc_traits.h:479:13: error:
use of deleted function ‘std::scoped_allocator_adaptor<std::allocator<int> >&
std::scoped_allocator_adaptor<std::allocator<int> >::operator=(const
std::scoped_allocator_adaptor<std::allocator<int> >&)’
     { __one = std::move(__two); }
             ^
In file included from saa.cc:2:0:
/home/jwakely/gcc/4.8.0/include/c++/4.8.0/scoped_allocator:176:11: note:
‘std::scoped_allocator_adaptor<std::allocator<int> >&
std::scoped_allocator_adaptor<std::allocator<int> >::operator=(const
std::scoped_allocator_adaptor<std::allocator<int> >&)’ is implicitly declared
as deleted because ‘std::scoped_allocator_adaptor<std::allocator<int> >’
declares a move constructor or move assignment operator
     class scoped_allocator_adaptor
           ^

Reply via email to