1 // { dg-do run { target c++11 } }
3 // Copyright (C) 2012-2025 Free Software Foundation, Inc.
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License along
17 // with this library; see the file COPYING3. If not see
18 // <http://www.gnu.org/licenses/>.
20 #include <unordered_map>
21 #include <testsuite_hooks.h>
26 num(int n
) : value(n
) {}
27 num(num
const&) = default;
28 num
& operator=(num
const&) = default;
29 num(num
&& o
) : value(o
.value
)
31 num
& operator=(num
&& o
)
44 size_t operator()(num
const& a
) const
50 static bool _S_called_on_moved_instance
;
51 bool operator()(num
const& a
, num
const& b
) const
53 if (a
.value
== -1 || b
.value
== -1)
54 _S_called_on_moved_instance
= true;
55 return a
.value
== b
.value
;
59 bool num_equal::_S_called_on_moved_instance
= false;
64 std::unordered_multimap
<num
, int, num_hash
, num_equal
> mmap
;
65 mmap
.insert(std::make_pair(num(1), 1));
66 mmap
.insert(std::make_pair(num(2), 2));
67 mmap
.insert(std::make_pair(num(1), 3));
68 mmap
.insert(std::make_pair(num(2), 4));
69 VERIFY( mmap
.size() == 4 );
70 auto iter
= mmap
.cbegin();
71 auto x0
= (iter
++)->first
.value
;
72 auto x1
= (iter
++)->first
.value
;
73 auto x2
= (iter
++)->first
.value
;
74 auto x3
= (iter
++)->first
.value
;
75 VERIFY( iter
== mmap
.cend() );
76 VERIFY( (x0
== 1 && x1
== 1 && x2
== 2 && x3
== 2)
77 || (x0
== 2 && x1
== 2 && x2
== 1 && x3
== 1) );
78 VERIFY( !num_equal::_S_called_on_moved_instance
);