[Bug libstdc++/87194] Associative container cannot be inserted from move iterators that refer to elements implicitly convertible to value_type

redi at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Mon Sep 3 14:26:00 GMT 2018


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

--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Author: redi
Date: Mon Sep  3 14:25:25 2018
New Revision: 264060

URL: https://gcc.gnu.org/viewcvs?rev=264060&root=gcc&view=rev
Log:
PR libstdc++/87194 fix range insertion into maps and sets

Since C++11 range insertion and construction of maps and sets from a
pair of iterators only requires that the iterator's value_type is
convertible to the container's value_type (previously it had to be the
same).

This fixes the implementation to meet that relaxed requirement, by
defining a pair of overloads that either insert or emplace, depending on
the iterator's value_type. Instead of adding yet another overload of
_M_insert_unique and _M_insert_equal, the overloads taking iterators are
renamed to _M_insert_range_unique and _M_insert_range_equal.

        PR libstdc++/87194
        * include/bits/stl_map.h
        (map::map(initializer_list<value_type>, const Compare&, const Alloc&))
        (map::map(initializer_list<value_type>, const Alloc&))
        (map::map(InputIterator, InputIterator, const Alloc&))
        (map::map(InputIterator, InputIterator))
        (map::map(InputIterator, InputIterator, const Compare&, const Alloc&))
        (map::insert(InputIterator, InputIterator)):
        Call _M_insert_range_unique instead of _M_insert_unique.
        * include/bits/stl_multimap.h
        (multimap::multimap(initializer_list<value_type>, const C&, const A&))
        (multimap::multimap(initializer_list<value_type>, const A&))
        (multimap::multimap(InputIterator, InputIterator, const A&))
        (multimap::multimap(InputIterator, InputIterator))
        (multimap::multimap(InputIterator, InputIterator, const C&, const A&))
        (multimap::insert(InputIterator, InputIterator)): Call
        _M_insert_range_equal instead of _M_insert_equal.
        * include/bits/stl_multiset.h
        (multiset::multiset(InputIterator, InputIterator))
        (multiset::multiset(InputIterator, InputIterator, const C&, const A&))
        (multiset::multiset(initializer_list<value_type>, const C&, const A&))
        (multiset::multiset(initializer_list<value_type>, const A&))
        (multiset::multiset(InputIterator, InputIterator, const A&))
        (multiset::insert(InputIterator, InputIterator)): Call
        _M_insert_range_equal instead of _M_insert_equal.
        * include/bits/stl_set.h
        (set::set(InputIterator, InputIterator))
        (set::set(InputIterator, InputIterator, const Compare&, const Alloc&))
        (set::set(initializer_list<value_type>, const Compare&, const Alloc&))
        (set::set(initializer_list<value_type>, const Alloc&))
        (set::set(InputIterator, InputIterator, const Alloc&))
        (set::insert(InputIterator, InputIterator)):
        Call _M_insert_range_unique instead of _M_insert_unique.
        * include/bits/stl_tree.h
        [__cplusplus >= 201103L] (_Rb_tree::__same_value_type): New alias
        template for SFINAE constraints.
        [__cplusplus >= 201103L] (_Rb_tree::_M_insert_range_unique): Pair of
        constrained overloads that either insert or emplace, depending on
        iterator's value_type.
        [__cplusplus >= 201103L] (_Rb_tree::_M_insert_range_equal): Likewise.
        [__cplusplus < 201103L] (_Rb_tree::_M_insert_range_unique)
        (_Rb_tree::_M_insert_range_equal): New functions replacing range
        versions of _M_insert_unique and _M_insert_equal.
        (_Rb_tree::_M_insert_unique(_InputIterator, _InputIterator))
        (_Rb_tree::_M_insert_equal(_InputIterator, _InputIterator)): Remove.
        * testsuite/23_containers/map/modifiers/insert/87194.cc: New test.
        * testsuite/23_containers/multimap/modifiers/insert/87194.cc: New test.
        * testsuite/23_containers/multiset/modifiers/insert/87194.cc: New test.
        * testsuite/23_containers/set/modifiers/insert/87194.cc: New test.

Added:
    trunk/libstdc++-v3/testsuite/23_containers/map/modifiers/insert/87194.cc
   
trunk/libstdc++-v3/testsuite/23_containers/multimap/modifiers/insert/87194.cc
   
trunk/libstdc++-v3/testsuite/23_containers/multiset/modifiers/insert/87194.cc
    trunk/libstdc++-v3/testsuite/23_containers/set/modifiers/insert/87194.cc
Modified:
    trunk/libstdc++-v3/ChangeLog
    trunk/libstdc++-v3/include/bits/stl_map.h
    trunk/libstdc++-v3/include/bits/stl_multimap.h
    trunk/libstdc++-v3/include/bits/stl_multiset.h
    trunk/libstdc++-v3/include/bits/stl_set.h
    trunk/libstdc++-v3/include/bits/stl_tree.h


More information about the Gcc-bugs mailing list