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

            Bug ID: 87658
           Summary: Cannot use move ctor when inserting to std::map
           Product: gcc
           Version: 6.4.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: filip.gawin at zoho dot com
  Target Milestone: ---

Problem is caused by this commit:
https://github.com/rwengine/openrw/commit/63ab663ea5f2282adfc574a3a537fbf0ec16d8bc#diff-a996c0379ea38c4fa42528c76c60ec03R864

It works with newer version of gcc(7/8) or msvc or clang.

Structure `Part` contains unique ptrs, so I've only defined move ctor and move
assignment operator (using `= default`).

If I change:
```
dynamicParts.insert({mf->getName(),
                         {mf, normal, damage, nullptr, nullptr, nullptr, false,
                          0.f, 0.f, 0.f}});
                         std::move(part)});
```
to
`dynamicParts[mf->getName()] = std::move(part);`

I'm getting:

```
In file included from
/usr/lib/gcc/x86_64-pc-linux-gnu/6.4.1/include/c++/functional:55:0,
                 from
/usr/lib/gcc/x86_64-pc-linux-gnu/6.4.1/include/c++/memory:79,
                 from
/run/media/filip/Zewn/openrw/shfil/rwengine/src/objects/VehicleObject.hpp:6,
                 from
/run/media/filip/Zewn/openrw/shfil/rwengine/src/objects/VehicleObject.cpp:1:
/usr/lib/gcc/x86_64-pc-linux-gnu/6.4.1/include/c++/tuple: In instantiation of
‘std::pair<_T1, _T2>::pair(std::tuple<_Args1 ...>&, std::tuple<_Args2 ...>&,
std::_Index_tuple<_Indexes1 ...>, std::_Index_tuple<_Indexes2 ...>) [with
_Args1 = {const std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> >&}; long unsigned int ..._Indexes1 = {0ul}; _Args2 = {};
long unsigned int ..._Indexes2 = {}; _T1 = const
std::__cxx11::basic_string<char>; _T2 = VehicleObject::Part]’:
/usr/lib/gcc/x86_64-pc-linux-gnu/6.4.1/include/c++/tuple:1579:63:   required
from ‘std::pair<_T1, _T2>::pair(std::piecewise_construct_t, std::tuple<_Args1
...>, std::tuple<_Args2 ...>) [with _Args1 = {const
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>
>&}; _Args2 = {}; _T1 = const std::__cxx11::basic_string<char>; _T2 =
VehicleObject::Part]’
/usr/lib/gcc/x86_64-pc-linux-gnu/6.4.1/include/c++/ext/new_allocator.h:120:4:  
required from ‘void __gnu_cxx::new_allocator<_Tp>::construct(_Up*, _Args&& ...)
[with _Up = std::pair<const std::__cxx11::basic_string<char>,
VehicleObject::Part>; _Args = {const std::piecewise_construct_t&,
std::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> >&>, std::tuple<>}; _Tp = std::pair<const
std::__cxx11::basic_string<char>, VehicleObject::Part>]’
/usr/lib/gcc/x86_64-pc-linux-gnu/6.4.1/include/c++/bits/alloc_traits.h:475:4:  
required from ‘static void std::allocator_traits<std::allocator<_Tp1>
>::construct(std::allocator_traits<std::allocator<_Tp1> >::allocator_type&,
_Up*, _Args&& ...) [with _Up = std::pair<const
std::__cxx11::basic_string<char>, VehicleObject::Part>; _Args = {const
std::piecewise_construct_t&, std::tuple<const std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char> >&>, std::tuple<>}; _Tp =
std::pair<const std::__cxx11::basic_string<char>, VehicleObject::Part>;
std::allocator_traits<std::allocator<_Tp1> >::allocator_type =
std::allocator<std::pair<const std::__cxx11::basic_string<char>,
VehicleObject::Part> >]’
/usr/lib/gcc/x86_64-pc-linux-gnu/6.4.1/include/c++/bits/hashtable_policy.h:1953:37:
  required from ‘std::__detail::_Hashtable_alloc<_NodeAlloc>::__node_type*
std::__detail::_Hashtable_alloc<_NodeAlloc>::_M_allocate_node(_Args&& ...)
[with _Args = {const std::piecewise_construct_t&, std::tuple<const
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>
>&>, std::tuple<>}; _NodeAlloc =
std::allocator<std::__detail::_Hash_node<std::pair<const
std::__cxx11::basic_string<char>, VehicleObject::Part>, true> >;
std::__detail::_Hashtable_alloc<_NodeAlloc>::__node_type =
std::__detail::_Hash_node<std::pair<const std::__cxx11::basic_string<char>,
VehicleObject::Part>, true>]’
/usr/lib/gcc/x86_64-pc-linux-gnu/6.4.1/include/c++/bits/hashtable_policy.h:595:8:
  required from ‘std::__detail::_Map_base<_Key, _Pair, _Alloc,
std::__detail::_Select1st, _Equal, _H1, _H2, _Hash, _RehashPolicy, _Traits,
true>::mapped_type& std::__detail::_Map_base<_Key, _Pair, _Alloc,
std::__detail::_Select1st, _Equal, _H1, _H2, _Hash, _RehashPolicy, _Traits,
true>::operator[](const key_type&) [with _Key =
std::__cxx11::basic_string<char>; _Pair = std::pair<const
std::__cxx11::basic_string<char>, VehicleObject::Part>; _Alloc =
std::allocator<std::pair<const std::__cxx11::basic_string<char>,
VehicleObject::Part> >; _Equal = std::equal_to<std::__cxx11::basic_string<char>
>; _H1 = std::hash<std::__cxx11::basic_string<char> >; _H2 =
std::__detail::_Mod_range_hashing; _Hash = std::__detail::_Default_ranged_hash;
_RehashPolicy = std::__detail::_Prime_rehash_policy; _Traits =
std::__detail::_Hashtable_traits<true, false, true>;
std::__detail::_Map_base<_Key, _Pair, _Alloc, std::__detail::_Select1st,
_Equal, _H1, _H2, _Hash, _RehashPolicy, _Traits, true>::mapped_type =
VehicleObject::Part; std::__detail::_Map_base<_Key, _Pair, _Alloc,
std::__detail::_Select1st, _Equal, _H1, _H2, _Hash, _RehashPolicy, _Traits,
true>::key_type = std::__cxx11::basic_string<char>]’
/usr/lib/gcc/x86_64-pc-linux-gnu/6.4.1/include/c++/bits/unordered_map.h:904:20:
  required from ‘std::unordered_map<_Key, _Tp, _Hash, _Pred,
_Alloc>::mapped_type& std::unordered_map<_Key, _Tp, _Hash, _Pred,
_Alloc>::operator[](const key_type&) [with _Key =
std::__cxx11::basic_string<char>; _Tp = VehicleObject::Part; _Hash =
std::hash<std::__cxx11::basic_string<char> >; _Pred =
std::equal_to<std::__cxx11::basic_string<char> >; _Alloc =
std::allocator<std::pair<const std::__cxx11::basic_string<char>,
VehicleObject::Part> >; std::unordered_map<_Key, _Tp, _Hash, _Pred,
_Alloc>::mapped_type = VehicleObject::Part; std::unordered_map<_Key, _Tp,
_Hash, _Pred, _Alloc>::key_type = std::__cxx11::basic_string<char>]’
/run/media/filip/Zewn/openrw/shfil/rwengine/src/objects/VehicleObject.cpp:885:31:
  required from here
/usr/lib/gcc/x86_64-pc-linux-gnu/6.4.1/include/c++/tuple:1590:70: error: no
matching function for call to ‘VehicleObject::Part::Part()’
         second(std::forward<_Args2>(std::get<_Indexes2>(__tuple2))...)
                                                                      ^
In file included from
/run/media/filip/Zewn/openrw/shfil/rwengine/src/objects/VehicleObject.cpp:1:0:
/run/media/filip/Zewn/openrw/shfil/rwengine/src/objects/VehicleObject.hpp:83:9:
note: candidate: VehicleObject::Part::Part(VehicleObject::Part&&)
         Part(Part&& part) = default;
         ^~~~
/run/media/filip/Zewn/openrw/shfil/rwengine/src/objects/VehicleObject.hpp:83:9:
note:   candidate expects 1 argument, 0 provided
/run/media/filip/Zewn/openrw/shfil/rwengine/src/objects/VehicleObject.hpp:65:9:
note: candidate: VehicleObject::Part::Part(ModelFrame*, Atomic*, Atomic*,
std::unique_ptr<btCollisionShape>, std::unique_ptr<btRigidBody>,
std::unique_ptr<btHingeConstraint>, bool, float, float, float)
         Part(ModelFrame* p_dummy, Atomic* p_normal, Atomic* p_damaged,
         ^~~~
/run/media/filip/Zewn/openrw/shfil/rwengine/src/objects/VehicleObject.hpp:65:9:
note:   candidate expects 10 arguments, 0 provided
```

Reply via email to