On Fri, 18 Apr 2025 at 09:11, Tomasz Kamiński <tkami...@redhat.com> wrote: > > This patch implements remainder of LWG2713 (after r15-8293-g64f5c854597759) > by adding missing allocator aware version of unordered associative containers > constructors accepting pair of iterators or initializer_list, and > corresponding > deduction guides. > > libstdc++-v3/ChangeLog: > > * include/bits/unordered_map.h (unordered_map): > Define constructors accepting: > (_InputIterator, _InputIterator, const allocator_type&), > (initializer_list<value_type>, const allocator_type&), > (unordered_multimap): Likewise. > * include/debug/unordered_map (unordered_map): Likewise. > (unordered_multimap): Likewise. > * include/bits/unordered_set.h (unordered_set): > Define constructors and deduction guide accepting: > (_InputIterator, _InputIterator, const allocator_type&), > (initializer_list<value_type>, const allocator_type&), > (unordered_multiset): Likewise. > * include/debug/unordered_set (unordered_set): Likewise. > (unordered_multiset): Likewise. > * testsuite/23_containers/unordered_map/cons/66055.cc: New tests. > * testsuite/23_containers/unordered_map/cons/deduction.cc: New tests. > * testsuite/23_containers/unordered_multimap/cons/66055.cc: New tests. > * testsuite/23_containers/unordered_multimap/cons/deduction.cc: New > tests. > * testsuite/23_containers/unordered_multiset/cons/66055.cc: New tests. > * testsuite/23_containers/unordered_multiset/cons/deduction.cc: New > tests. > * testsuite/23_containers/unordered_set/cons/66055.cc: New tests. > * testsuite/23_containers/unordered_set/cons/deduction.cc: New tests. > --- > I would like to merge rest of the changes, now that we are in 16. > Tested on x86_64-linux. OK for trunk?
OK for trunk, thanks. > > libstdc++-v3/include/bits/unordered_map.h | 30 ++++++++ > libstdc++-v3/include/bits/unordered_set.h | 71 +++++++++++++++++++ > libstdc++-v3/include/debug/unordered_map | 22 ++++++ > libstdc++-v3/include/debug/unordered_set | 54 ++++++++++++++ > .../23_containers/unordered_map/cons/66055.cc | 11 +-- > .../unordered_map/cons/deduction.cc | 28 ++++++++ > .../unordered_multimap/cons/66055.cc | 10 +-- > .../unordered_multimap/cons/deduction.cc | 34 +++++++++ > .../unordered_multiset/cons/66055.cc | 10 +-- > .../unordered_multiset/cons/deduction.cc | 28 ++++++++ > .../23_containers/unordered_set/cons/66055.cc | 10 +-- > .../unordered_set/cons/deduction.cc | 28 ++++++++ > 12 files changed, 320 insertions(+), 16 deletions(-) > > diff --git a/libstdc++-v3/include/bits/unordered_map.h > b/libstdc++-v3/include/bits/unordered_map.h > index 5bc58e849ff..fc07ffc998c 100644 > --- a/libstdc++-v3/include/bits/unordered_map.h > +++ b/libstdc++-v3/include/bits/unordered_map.h > @@ -251,6 +251,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER > : unordered_map(__n, __hf, key_equal(), __a) > { } > > + // _GLIBCXX_RESOLVE_LIB_DEFECTS > + // 2713. More missing allocator-extended constructors for unordered > containers > + template<typename _InputIterator> > + unordered_map(_InputIterator __first, _InputIterator __last, > + const allocator_type& __a) > + : unordered_map(__first, __last, 0, hasher(), key_equal(), __a) > + { } > + > template<typename _InputIterator> > unordered_map(_InputIterator __first, _InputIterator __last, > size_type __n, > @@ -271,6 +279,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER > : unordered_map(__l, __n, hasher(), key_equal(), __a) > { } > > + // _GLIBCXX_RESOLVE_LIB_DEFECTS > + // 2713. More missing allocator-extended constructors for unordered > containers > + unordered_map(initializer_list<value_type> __l, > + const allocator_type& __a) > + : unordered_map(__l, 0, hasher(), key_equal(), __a) > + { } > + > unordered_map(initializer_list<value_type> __l, > size_type __n, const hasher& __hf, > const allocator_type& __a) > @@ -1504,6 +1519,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER > : unordered_multimap(__n, __hf, key_equal(), __a) > { } > > + // _GLIBCXX_RESOLVE_LIB_DEFECTS > + // 2713. More missing allocator-extended constructors for unordered > containers > + template<typename _InputIterator> > + unordered_multimap(_InputIterator __first, _InputIterator __last, > + const allocator_type& __a) > + : unordered_multimap(__first, __last, 0, hasher(), key_equal(), __a) > + { } > + > template<typename _InputIterator> > unordered_multimap(_InputIterator __first, _InputIterator __last, > size_type __n, > @@ -1518,6 +1541,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER > : unordered_multimap(__first, __last, __n, __hf, key_equal(), __a) > { } > > + // _GLIBCXX_RESOLVE_LIB_DEFECTS > + // 2713. More missing allocator-extended constructors for unordered > containers > + unordered_multimap(initializer_list<value_type> __l, > + const allocator_type& __a) > + : unordered_multimap(__l, 0, hasher(), key_equal(), __a) > + { } > + > unordered_multimap(initializer_list<value_type> __l, > size_type __n, > const allocator_type& __a) > diff --git a/libstdc++-v3/include/bits/unordered_set.h > b/libstdc++-v3/include/bits/unordered_set.h > index 091bae60e55..5649dd76e1f 100644 > --- a/libstdc++-v3/include/bits/unordered_set.h > +++ b/libstdc++-v3/include/bits/unordered_set.h > @@ -245,6 +245,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER > : unordered_set(__n, __hf, key_equal(), __a) > { } > > + // _GLIBCXX_RESOLVE_LIB_DEFECTS > + // 2713. More missing allocator-extended constructors for unordered > container > + template<typename _InputIterator> > + unordered_set(_InputIterator __first, _InputIterator __last, > + const allocator_type& __a) > + : unordered_set(__first, __last, 0, hasher(), key_equal(), __a) > + { } > + > template<typename _InputIterator> > unordered_set(_InputIterator __first, _InputIterator __last, > size_type __n, > @@ -259,6 +267,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER > : unordered_set(__first, __last, __n, __hf, key_equal(), __a) > { } > > + > + // _GLIBCXX_RESOLVE_LIB_DEFECTS > + // 2713. More missing allocator-extended constructors for unordered > container > + unordered_set(initializer_list<value_type> __l, > + const allocator_type& __a) > + : unordered_set(__l, 0, hasher(), key_equal(), __a) > + { } > + > unordered_set(initializer_list<value_type> __l, > size_type __n, > const allocator_type& __a) > @@ -987,6 +1003,19 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER > typename iterator_traits<_InputIterator>::value_type>, > _Allocator>; > > + // _GLIBCXX_RESOLVE_LIB_DEFECTS > + // 2713. More missing allocator-extended constructors for unordered > container > + template<typename _InputIterator, typename _Allocator, > + typename = _RequireInputIter<_InputIterator>, > + typename = _RequireAllocator<_Allocator>> > + unordered_set(_InputIterator, _InputIterator, _Allocator) > + -> unordered_set<typename iterator_traits<_InputIterator>::value_type, > + hash< > + typename iterator_traits<_InputIterator>::value_type>, > + equal_to< > + typename iterator_traits<_InputIterator>::value_type>, > + _Allocator>; > + > template<typename _InputIterator, typename _Hash, typename _Allocator, > typename = _RequireInputIter<_InputIterator>, > typename = _RequireNotAllocatorOrIntegral<_Hash>, > @@ -1006,6 +1035,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER > unordered_set<int>::size_type, _Allocator) > -> unordered_set<_Tp, hash<_Tp>, equal_to<_Tp>, _Allocator>; > > + // _GLIBCXX_RESOLVE_LIB_DEFECTS > + // 2713. More missing allocator-extended constructors for unordered > container > + template<typename _Tp, typename _Allocator, > + typename = _RequireAllocator<_Allocator>> > + unordered_set(initializer_list<_Tp>, _Allocator) > + -> unordered_set<_Tp, hash<_Tp>, equal_to<_Tp>, _Allocator>; > + > template<typename _Tp, typename _Hash, typename _Allocator, > typename = _RequireNotAllocatorOrIntegral<_Hash>, > typename = _RequireAllocator<_Allocator>> > @@ -1223,6 +1259,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER > : unordered_multiset(__n, __hf, key_equal(), __a) > { } > > + // _GLIBCXX_RESOLVE_LIB_DEFECTS > + // 2713. More missing allocator-extended constructors for unordered > container > + template<typename _InputIterator> > + unordered_multiset(_InputIterator __first, _InputIterator __last, > + const allocator_type& __a) > + : unordered_multiset(__first, __last, 0, hasher(), key_equal(), __a) > + { } > + > template<typename _InputIterator> > unordered_multiset(_InputIterator __first, _InputIterator __last, > size_type __n, > @@ -1237,6 +1281,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER > : unordered_multiset(__first, __last, __n, __hf, key_equal(), __a) > { } > > + // _GLIBCXX_RESOLVE_LIB_DEFECTS > + // 2713. More missing allocator-extended constructors for unordered > container > + unordered_multiset(initializer_list<value_type> __l, > + const allocator_type& __a) > + : unordered_multiset(__l, 0, hasher(), key_equal(), __a) > + { } > + > unordered_multiset(initializer_list<value_type> __l, > size_type __n, > const allocator_type& __a) > @@ -1949,6 +2000,19 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER > > iterator_traits<_InputIterator>::value_type>, > _Allocator>; > > + // _GLIBCXX_RESOLVE_LIB_DEFECTS > + // 2713. More missing allocator-extended constructors for unordered > container > + template<typename _InputIterator, typename _Allocator, > + typename = _RequireInputIter<_InputIterator>, > + typename = _RequireAllocator<_Allocator>> > + unordered_multiset(_InputIterator, _InputIterator, _Allocator) > + -> unordered_multiset<typename > iterator_traits<_InputIterator>::value_type, > + hash<typename > + iterator_traits<_InputIterator>::value_type>, > + equal_to<typename > + > iterator_traits<_InputIterator>::value_type>, > + _Allocator>; > + > template<typename _InputIterator, typename _Hash, typename _Allocator, > typename = _RequireInputIter<_InputIterator>, > typename = _RequireNotAllocatorOrIntegral<_Hash>, > @@ -1970,6 +2034,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER > unordered_multiset<int>::size_type, _Allocator) > -> unordered_multiset<_Tp, hash<_Tp>, equal_to<_Tp>, _Allocator>; > > + // _GLIBCXX_RESOLVE_LIB_DEFECTS > + // 2713. More missing allocator-extended constructors for unordered > container > + template<typename _Tp, typename _Allocator, > + typename = _RequireAllocator<_Allocator>> > + unordered_multiset(initializer_list<_Tp>, _Allocator) > + -> unordered_multiset<_Tp, hash<_Tp>, equal_to<_Tp>, _Allocator>; > + > template<typename _Tp, typename _Hash, typename _Allocator, > typename = _RequireNotAllocatorOrIntegral<_Hash>, > typename = _RequireAllocator<_Allocator>> > diff --git a/libstdc++-v3/include/debug/unordered_map > b/libstdc++-v3/include/debug/unordered_map > index 448f681e16b..7673db10b09 100644 > --- a/libstdc++-v3/include/debug/unordered_map > +++ b/libstdc++-v3/include/debug/unordered_map > @@ -173,6 +173,12 @@ namespace __debug > : unordered_map(__n, __hf, key_equal(), __a) > { } > > + template<typename _InputIterator> > + unordered_map(_InputIterator __first, _InputIterator __last, > + const allocator_type& __a) > + : unordered_map(__first, __last, 0, hasher(), key_equal(), __a) > + { } > + > template<typename _InputIterator> > unordered_map(_InputIterator __first, _InputIterator __last, > size_type __n, > @@ -188,6 +194,11 @@ namespace __debug > : unordered_map(__first, __last, __n, __hf, key_equal(), __a) > { } > > + unordered_map(initializer_list<value_type> __l, > + const allocator_type& __a) > + : unordered_map(__l, 0, hasher(), key_equal(), __a) > + { } > + > unordered_map(initializer_list<value_type> __l, > size_type __n, > const allocator_type& __a) > @@ -1051,6 +1062,12 @@ namespace __debug > : unordered_multimap(__n, __hf, key_equal(), __a) > { } > > + template<typename _InputIterator> > + unordered_multimap(_InputIterator __first, _InputIterator __last, > + const allocator_type& __a) > + : unordered_multimap(__first, __last, 0, hasher(), key_equal(), __a) > + { } > + > template<typename _InputIterator> > unordered_multimap(_InputIterator __first, _InputIterator __last, > size_type __n, > @@ -1065,6 +1082,11 @@ namespace __debug > : unordered_multimap(__first, __last, __n, __hf, key_equal(), __a) > { } > > + unordered_multimap(initializer_list<value_type> __l, > + const allocator_type& __a) > + : unordered_multimap(__l, 0, hasher(), key_equal(), __a) > + { } > + > unordered_multimap(initializer_list<value_type> __l, > size_type __n, > const allocator_type& __a) > diff --git a/libstdc++-v3/include/debug/unordered_set > b/libstdc++-v3/include/debug/unordered_set > index 4255f6ee770..932600d55e3 100644 > --- a/libstdc++-v3/include/debug/unordered_set > +++ b/libstdc++-v3/include/debug/unordered_set > @@ -168,6 +168,12 @@ namespace __debug > : unordered_set(__n, __hf, key_equal(), __a) > { } > > + template<typename _InputIterator> > + unordered_set(_InputIterator __first, _InputIterator __last, > + const allocator_type& __a) > + : unordered_set(__first, __last, 0, hasher(), key_equal(), __a) > + { } > + > template<typename _InputIterator> > unordered_set(_InputIterator __first, _InputIterator __last, > size_type __n, > @@ -182,6 +188,11 @@ namespace __debug > : unordered_set(__first, __last, __n, __hf, key_equal(), __a) > { } > > + unordered_set(initializer_list<value_type> __l, > + const allocator_type& __a) > + : unordered_set(__l, 0, hasher(), key_equal(), __a) > + { } > + > unordered_set(initializer_list<value_type> __l, > size_type __n, > const allocator_type& __a) > @@ -713,6 +724,17 @@ namespace __debug > typename iterator_traits<_InputIterator>::value_type>, > _Allocator>; > > + template<typename _InputIterator, typename _Allocator, > + typename = _RequireInputIter<_InputIterator>, > + typename = _RequireAllocator<_Allocator>> > + unordered_set(_InputIterator, _InputIterator, _Allocator) > + -> unordered_set<typename iterator_traits<_InputIterator>::value_type, > + hash< > + typename iterator_traits<_InputIterator>::value_type>, > + equal_to< > + typename iterator_traits<_InputIterator>::value_type>, > + _Allocator>; > + > template<typename _InputIterator, typename _Hash, typename _Allocator, > typename = _RequireInputIter<_InputIterator>, > typename = _RequireNotAllocatorOrIntegral<_Hash>, > @@ -732,6 +754,11 @@ namespace __debug > unordered_set<int>::size_type, _Allocator) > -> unordered_set<_Tp, hash<_Tp>, equal_to<_Tp>, _Allocator>; > > + template<typename _Tp, typename _Allocator, > + typename = _RequireAllocator<_Allocator>> > + unordered_set(initializer_list<_Tp>, _Allocator) > + -> unordered_set<_Tp, hash<_Tp>, equal_to<_Tp>, _Allocator>; > + > template<typename _Tp, typename _Hash, typename _Allocator, > typename = _RequireNotAllocatorOrIntegral<_Hash>, > typename = _RequireAllocator<_Allocator>> > @@ -876,6 +903,12 @@ namespace __debug > : unordered_multiset(__n, __hf, key_equal(), __a) > { } > > + template<typename _InputIterator> > + unordered_multiset(_InputIterator __first, _InputIterator __last, > + const allocator_type& __a) > + : unordered_multiset(__first, __last, 0, hasher(), key_equal(), __a) > + { } > + > template<typename _InputIterator> > unordered_multiset(_InputIterator __first, _InputIterator __last, > size_type __n, > @@ -890,6 +923,11 @@ namespace __debug > : unordered_multiset(__first, __last, __n, __hf, key_equal(), __a) > { } > > + unordered_multiset(initializer_list<value_type> __l, > + const allocator_type& __a) > + : unordered_multiset(__l, 0, hasher(), key_equal(), __a) > + { } > + > unordered_multiset(initializer_list<value_type> __l, > size_type __n, > const allocator_type& __a) > @@ -1416,6 +1454,17 @@ namespace __debug > > iterator_traits<_InputIterator>::value_type>, > _Allocator>; > > + template<typename _InputIterator, typename _Allocator, > + typename = _RequireInputIter<_InputIterator>, > + typename = _RequireAllocator<_Allocator>> > + unordered_multiset(_InputIterator, _InputIterator, _Allocator) > + -> unordered_multiset<typename > iterator_traits<_InputIterator>::value_type, > + hash<typename > + iterator_traits<_InputIterator>::value_type>, > + equal_to<typename > + > iterator_traits<_InputIterator>::value_type>, > + _Allocator>; > + > template<typename _InputIterator, typename _Hash, typename _Allocator, > typename = _RequireInputIter<_InputIterator>, > typename = _RequireNotAllocatorOrIntegral<_Hash>, > @@ -1437,6 +1486,11 @@ namespace __debug > unordered_multiset<int>::size_type, _Allocator) > -> unordered_multiset<_Tp, hash<_Tp>, equal_to<_Tp>, _Allocator>; > > + template<typename _Tp, typename _Allocator, > + typename = _RequireAllocator<_Allocator>> > + unordered_multiset(initializer_list<_Tp>, _Allocator) > + -> unordered_multiset<_Tp, hash<_Tp>, equal_to<_Tp>, _Allocator>; > + > template<typename _Tp, typename _Hash, typename _Allocator, > typename = _RequireNotAllocatorOrIntegral<_Hash>, > typename = _RequireAllocator<_Allocator>> > diff --git a/libstdc++-v3/testsuite/23_containers/unordered_map/cons/66055.cc > b/libstdc++-v3/testsuite/23_containers/unordered_map/cons/66055.cc > index c7a12c14425..0f959760713 100644 > --- a/libstdc++-v3/testsuite/23_containers/unordered_map/cons/66055.cc > +++ b/libstdc++-v3/testsuite/23_containers/unordered_map/cons/66055.cc > @@ -27,7 +27,10 @@ using alloc_type = test_type::allocator_type; > > test_type h1(10, alloc_type()); > test_type h2(10, hasher_type(), alloc_type()); > -test_type h3(h1.begin(), h1.end(), 10, alloc_type()); > -test_type h4(h1.begin(), h1.end(), 10, hasher_type(), alloc_type()); > -test_type h5({ { 1, 1 } }, 10, alloc_type()); > -test_type h6({ { 1, 1 } }, 10, hasher_type(), alloc_type()); > +test_type h3(h1.begin(), h1.end(), alloc_type()); > +test_type h4(h1.begin(), h1.end(), 10, alloc_type()); > +test_type h5(h1.begin(), h1.end(), 10, hasher_type(), alloc_type()); > +test_type h6({ { 1, 1 } }, alloc_type()); > +test_type h7({ { 1, 1 } }, 10, alloc_type()); > +test_type h8({ { 1, 1 } }, 10, hasher_type(), alloc_type()); > + > diff --git > a/libstdc++-v3/testsuite/23_containers/unordered_map/cons/deduction.cc > b/libstdc++-v3/testsuite/23_containers/unordered_map/cons/deduction.cc > index 8b69af896a2..fa182f5866d 100644 > --- a/libstdc++-v3/testsuite/23_containers/unordered_map/cons/deduction.cc > +++ b/libstdc++-v3/testsuite/23_containers/unordered_map/cons/deduction.cc > @@ -15,12 +15,28 @@ static_assert(std::is_same_v< > {2, 3.0}, {3, 4.0}}}), > std::unordered_map<int, double>>); > > +static_assert(std::is_same_v< > + decltype(std::unordered_map{{std::pair{1, 2.0}, > + {2, 3.0}, {3, 4.0}}, > + SimpleAllocator<std::pair<const int, double>>{}}), > + std::unordered_map<int, double, std::hash<int>, > + std::equal_to<int>, > + SimpleAllocator<std::pair<const int, double>>>>); > + > static_assert(std::is_same_v< > decltype(std::unordered_map{ > {std::pair{1, 2.0}, {2, 3.0}, {3, 4.0}}, > 1}), > std::unordered_map<int, double>>); > > +static_assert(std::is_same_v< > + decltype(std::unordered_map{ > + {std::pair{1, 2.0}, {2, 3.0}, {3, 4.0}}, > + 1, SimpleAllocator<std::pair<const int, double>>{}}), > + std::unordered_map<int, double, std::hash<int>, > + std::equal_to<int>, > + SimpleAllocator<std::pair<const int, double>>>>); > + > static_assert(std::is_same_v< > decltype(std::unordered_map{{std::pair{1, 2.0}, > {2, 3.0}, {3, 4.0}}, > @@ -96,6 +112,18 @@ void f() > std::equal_to<int>, > SimpleAllocator<std::pair<const int, double>>>>); > > + static_assert(std::is_same_v< > + decltype(std::unordered_map{x.begin(), x.end(), > + std::allocator<std::pair<const int, double>>{}}), > + std::unordered_map<int, double>>); > + > + static_assert(std::is_same_v< > + decltype(std::unordered_map{x.begin(), x.end(), > + SimpleAllocator<std::pair<const int, double>>{}}), > + std::unordered_map<int, double, std::hash<int>, > + std::equal_to<int>, > + SimpleAllocator<std::pair<const int, double>>>>); > + > static_assert(std::is_same_v< > decltype(std::unordered_map{x.begin(), x.end(), > 1, std::hash<int>{}, > diff --git > a/libstdc++-v3/testsuite/23_containers/unordered_multimap/cons/66055.cc > b/libstdc++-v3/testsuite/23_containers/unordered_multimap/cons/66055.cc > index dc0a65196c8..eecc60024fe 100644 > --- a/libstdc++-v3/testsuite/23_containers/unordered_multimap/cons/66055.cc > +++ b/libstdc++-v3/testsuite/23_containers/unordered_multimap/cons/66055.cc > @@ -27,7 +27,9 @@ using alloc_type = test_type::allocator_type; > > test_type h1(10, alloc_type()); > test_type h2(10, hasher_type(), alloc_type()); > -test_type h3(h1.begin(), h1.end(), 10, alloc_type()); > -test_type h4(h1.begin(), h1.end(), 10, hasher_type(), alloc_type()); > -test_type h5({ { 1, 1 } }, 10, alloc_type()); > -test_type h6({ { 1, 1 } }, 10, hasher_type(), alloc_type()); > +test_type h3(h1.begin(), h1.end(), alloc_type()); > +test_type h4(h1.begin(), h1.end(), 10, alloc_type()); > +test_type h5(h1.begin(), h1.end(), 10, hasher_type(), alloc_type()); > +test_type h6({ { 1, 1 } }, alloc_type()); > +test_type h7({ { 1, 1 } }, 10, alloc_type()); > +test_type h8({ { 1, 1 } }, 10, hasher_type(), alloc_type()); > diff --git > a/libstdc++-v3/testsuite/23_containers/unordered_multimap/cons/deduction.cc > b/libstdc++-v3/testsuite/23_containers/unordered_multimap/cons/deduction.cc > index e7e535b527a..4de23fe3e79 100644 > --- > a/libstdc++-v3/testsuite/23_containers/unordered_multimap/cons/deduction.cc > +++ > b/libstdc++-v3/testsuite/23_containers/unordered_multimap/cons/deduction.cc > @@ -15,6 +15,28 @@ static_assert(std::is_same_v< > {2, 3.0}, {3, 4.0}}}), > std::unordered_multimap<int, double>>); > > +static_assert(std::is_same_v< > + decltype(std::unordered_multimap{ > + {std::pair{1, 2.0}, {2, 3.0}, {3, 4.0}}, > + SimpleAllocator<std::pair<const int, double>>{}}), > + std::unordered_multimap<int, double, std::hash<int>, > + std::equal_to<int>, > + SimpleAllocator<std::pair<const int, double>>>>); > + > +static_assert(std::is_same_v< > + decltype(std::unordered_multimap{ > + {std::pair{1, 2.0}, {2, 3.0}, {3, 4.0}}, > + 1}), > + std::unordered_multimap<int, double>>); > + > +static_assert(std::is_same_v< > + decltype(std::unordered_multimap{ > + {std::pair{1, 2.0}, {2, 3.0}, {3, 4.0}}, > + 1, SimpleAllocator<std::pair<const int, double>>{}}), > + std::unordered_multimap<int, double, std::hash<int>, > + std::equal_to<int>, > + SimpleAllocator<std::pair<const int, double>>>>); > + > static_assert(std::is_same_v< > decltype(std::unordered_multimap{{std::pair{1, 2.0}, > {2, 3.0}, {3, 4.0}}, > @@ -105,6 +127,18 @@ void f() > std::equal_to<int>, > SimpleAllocator<std::pair<const int, double>>>>); > > + static_assert(std::is_same_v< > + decltype(std::unordered_multimap{x.begin(), x.end(), > + std::allocator<std::pair<const int, double>>{}}), > + std::unordered_multimap<int, double>>); > + > + static_assert(std::is_same_v< > + decltype(std::unordered_multimap{x.begin(), x.end(), > + SimpleAllocator<std::pair<const int, double>>{}}), > + std::unordered_multimap<int, double, std::hash<int>, > + std::equal_to<int>, > + SimpleAllocator<std::pair<const int, double>>>>); > + > static_assert(std::is_same_v< > decltype(std::unordered_multimap{x.begin(), x.end(), > 1, std::hash<int>{}, > diff --git > a/libstdc++-v3/testsuite/23_containers/unordered_multiset/cons/66055.cc > b/libstdc++-v3/testsuite/23_containers/unordered_multiset/cons/66055.cc > index 5c34b94c00d..3ba609fc449 100644 > --- a/libstdc++-v3/testsuite/23_containers/unordered_multiset/cons/66055.cc > +++ b/libstdc++-v3/testsuite/23_containers/unordered_multiset/cons/66055.cc > @@ -27,7 +27,9 @@ using alloc_type = test_type::allocator_type; > > test_type h1(10, alloc_type()); > test_type h2(10, hasher_type(), alloc_type()); > -test_type h3(h1.begin(), h1.end(), 10, alloc_type()); > -test_type h4(h1.begin(), h1.end(), 10, hasher_type(), alloc_type()); > -test_type h5({ 1, 1 }, 10, alloc_type()); > -test_type h6({ 1, 1 }, 10, hasher_type(), alloc_type()); > +test_type h3(h1.begin(), h1.end(), alloc_type()); > +test_type h4(h1.begin(), h1.end(), 10, alloc_type()); > +test_type h5(h1.begin(), h1.end(), 10, hasher_type(), alloc_type()); > +test_type h6({ 1, 1 }, alloc_type()); > +test_type h7({ 1, 1 }, 10, alloc_type()); > +test_type h9({ 1, 1 }, 10, hasher_type(), alloc_type()); > diff --git > a/libstdc++-v3/testsuite/23_containers/unordered_multiset/cons/deduction.cc > b/libstdc++-v3/testsuite/23_containers/unordered_multiset/cons/deduction.cc > index 22b729749e2..46cd2105acc 100644 > --- > a/libstdc++-v3/testsuite/23_containers/unordered_multiset/cons/deduction.cc > +++ > b/libstdc++-v3/testsuite/23_containers/unordered_multiset/cons/deduction.cc > @@ -19,6 +19,22 @@ static_assert(std::is_same_v< > 0, std::hash<int>{}, std::allocator<int>{}}), > std::unordered_multiset<int>>); > > +static_assert(std::is_same_v< > + decltype(std::unordered_multiset{{1, 2, 3}}), > + std::unordered_multiset<int>>); > + > +static_assert(std::is_same_v< > + decltype(std::unordered_multiset{{1, 2, 3}, > + std::allocator<int>{}}), > + std::unordered_multiset<int>>); > + > +static_assert(std::is_same_v< > + decltype(std::unordered_multiset{{1, 2, 3}, > + SimpleAllocator<int>{}}), > + std::unordered_multiset<int, std::hash<int>, > + std::equal_to<int>, > + SimpleAllocator<int>>>); > + > static_assert(std::is_same_v< > decltype(std::unordered_multiset{{1, 2, 3}, > {}}), > @@ -86,6 +102,18 @@ void f() > {}, std::hash<int>{}, std::equal_to<int>{}}), > std::unordered_multiset<int>>); > > + static_assert(std::is_same_v< > + decltype(std::unordered_multiset{x.begin(), x.end(), > + std::allocator<int>{}}), > + std::unordered_multiset<int>>); > + > + static_assert(std::is_same_v< > + decltype(std::unordered_multiset{x.begin(), x.end(), > + SimpleAllocator<int>{}}), > + std::unordered_multiset<int, std::hash<int>, > + std::equal_to<int>, > + SimpleAllocator<int>>>); > + > static_assert(std::is_same_v< > decltype(std::unordered_multiset{x.begin(), x.end(), > {}, std::hash<int>{}, std::allocator<int>{}}), > diff --git a/libstdc++-v3/testsuite/23_containers/unordered_set/cons/66055.cc > b/libstdc++-v3/testsuite/23_containers/unordered_set/cons/66055.cc > index 0d318a04b2b..96c0ca3be53 100644 > --- a/libstdc++-v3/testsuite/23_containers/unordered_set/cons/66055.cc > +++ b/libstdc++-v3/testsuite/23_containers/unordered_set/cons/66055.cc > @@ -27,7 +27,9 @@ using alloc_type = test_type::allocator_type; > > test_type h1(10, alloc_type()); > test_type h2(10, hasher_type(), alloc_type()); > -test_type h3(h1.begin(), h1.end(), 10, alloc_type()); > -test_type h4(h1.begin(), h1.end(), 10, hasher_type(), alloc_type()); > -test_type h5({ 1, 1 }, 10, alloc_type()); > -test_type h6({ 1, 1 }, 10, hasher_type(), alloc_type()); > +test_type h3(h1.begin(), h1.end(), alloc_type()); > +test_type h4(h1.begin(), h1.end(), 10, alloc_type()); > +test_type h5(h1.begin(), h1.end(), 10, hasher_type(), alloc_type()); > +test_type h6({ 1, 1 }, alloc_type()); > +test_type h7({ 1, 1 }, 10, alloc_type()); > +test_type h9({ 1, 1 }, 10, hasher_type(), alloc_type()); > diff --git > a/libstdc++-v3/testsuite/23_containers/unordered_set/cons/deduction.cc > b/libstdc++-v3/testsuite/23_containers/unordered_set/cons/deduction.cc > index db5858132fc..9558d70505f 100644 > --- a/libstdc++-v3/testsuite/23_containers/unordered_set/cons/deduction.cc > +++ b/libstdc++-v3/testsuite/23_containers/unordered_set/cons/deduction.cc > @@ -19,6 +19,22 @@ static_assert(std::is_same_v< > 0, std::hash<int>{}, std::allocator<int>{}}), > std::unordered_set<int>>); > > +static_assert(std::is_same_v< > + decltype(std::unordered_set{{1, 2, 3}}), > + std::unordered_set<int>>); > + > +static_assert(std::is_same_v< > + decltype(std::unordered_set{{1, 2, 3}, > + std::allocator<int>{}}), > + std::unordered_set<int>>); > + > +static_assert(std::is_same_v< > + decltype(std::unordered_set{{1, 2, 3}, > + SimpleAllocator<int>{}}), > + std::unordered_set<int, std::hash<int>, > + std::equal_to<int>, > + SimpleAllocator<int>>>); > + > static_assert(std::is_same_v< > decltype(std::unordered_set{{1, 2, 3}, > {}}), > @@ -91,6 +107,18 @@ void f() > {})), > std::unordered_set<int>>); > > + static_assert(std::is_same_v< > + decltype(std::unordered_set{x.begin(), x.end(), > + std::allocator<int>{}}), > + std::unordered_set<int>>); > + > + static_assert(std::is_same_v< > + decltype(std::unordered_set{x.begin(), x.end(), > + SimpleAllocator<int>{}}), > + std::unordered_set<int, std::hash<int>, > + std::equal_to<int>, > + SimpleAllocator<int>>>); > + > static_assert(std::is_same_v< > decltype(std::unordered_set{x.begin(), x.end(), 1}), > std::unordered_set<int>>); > -- > 2.49.0 >