1 // Copyright (C) 2015-2025 Free Software Foundation, Inc.
3 // This file is part of the GNU ISO C++ Library. This library is free
4 // software; you can redistribute it and/or modify it under the
5 // terms of the GNU General Public License as published by the
6 // Free Software Foundation; either version 3, or (at your option)
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License along
15 // with this library; see the file COPYING3. If not see
16 // <http://www.gnu.org/licenses/>.
18 // { dg-do run { target c++14 } }
21 #include <testsuite_hooks.h>
25 typedef void is_transparent
;
27 bool operator()(int i
, long l
) const { return i
< l
; }
28 bool operator()(long l
, int i
) const { return l
< i
; }
29 bool operator()(int i
, int j
) const { ++count
; return i
< j
; }
36 using test_type
= std::set
<int, Cmp
>;
38 test_type x
{ 1, 3, 5 };
39 const test_type
& cx
= x
;
47 VERIFY( it
!= x
.end() && *it
== 1 );
49 VERIFY( it
== x
.end() );
51 auto cit
= cx
.find(3L);
52 VERIFY( cit
!= cx
.end() && *cit
== 3 );
54 VERIFY( cit
== cx
.end() );
56 VERIFY( Cmp::count
== 0 );
58 static_assert(std::is_same
<decltype(it
), test_type::iterator
>::value
,
59 "find returns iterator");
60 static_assert(std::is_same
<decltype(cit
), test_type::const_iterator
>::value
,
61 "const find returns const_iterator");
74 auto cn
= cx
.count(3L);
79 VERIFY( Cmp::count
== 0 );
87 auto it
= x
.lower_bound(1L);
88 VERIFY( it
!= x
.end() && *it
== 1 );
89 it
= x
.lower_bound(2L);
90 VERIFY( it
!= x
.end() && *it
== 3 );
92 auto cit
= cx
.lower_bound(1L);
93 VERIFY( cit
!= cx
.end() && *cit
== 1 );
94 cit
= cx
.lower_bound(2L);
95 VERIFY( cit
!= cx
.end() && *cit
== 3 );
97 VERIFY( Cmp::count
== 0 );
99 static_assert(std::is_same
<decltype(it
), test_type::iterator
>::value
,
100 "lower_bound returns iterator");
101 static_assert(std::is_same
<decltype(cit
), test_type::const_iterator
>::value
,
102 "const lower_bound returns const_iterator");
110 auto it
= x
.upper_bound(1L);
111 VERIFY( it
!= x
.end() && *it
== 3 );
112 it
= x
.upper_bound(5L);
113 VERIFY( it
== x
.end() );
115 auto cit
= cx
.upper_bound(1L);
116 VERIFY( cit
!= cx
.end() && *cit
== 3 );
117 cit
= cx
.upper_bound(5L);
118 VERIFY( cit
== cx
.end() );
120 VERIFY( Cmp::count
== 0 );
122 static_assert(std::is_same
<decltype(it
), test_type::iterator
>::value
,
123 "upper_bound returns iterator");
124 static_assert(std::is_same
<decltype(cit
), test_type::const_iterator
>::value
,
125 "const upper_bound returns const_iterator");
133 auto it
= x
.equal_range(1L);
134 VERIFY( it
.first
!= it
.second
&& *it
.first
== 1 );
135 it
= x
.equal_range(2L);
136 VERIFY( it
.first
== it
.second
&& it
.first
!= x
.end() );
138 auto cit
= cx
.equal_range(1L);
139 VERIFY( cit
.first
!= cit
.second
&& *cit
.first
== 1 );
140 cit
= cx
.equal_range(2L);
141 VERIFY( cit
.first
== cit
.second
&& cit
.first
!= cx
.end() );
143 VERIFY( Cmp::count
== 0 );
145 using pair
= std::pair
<test_type::iterator
, test_type::iterator
>;
146 static_assert(std::is_same
<decltype(it
), pair
>::value
,
147 "equal_range returns pair<iterator, iterator>");
148 using cpair
= std::pair
<test_type::const_iterator
, test_type::const_iterator
>;
149 static_assert(std::is_same
<decltype(cit
), cpair
>::value
,
150 "const equal_range returns pair<const_iterator, const_iterator>");
156 // https://gcc.gnu.org/ml/libstdc++/2015-01/msg00176.html
157 // Verify the new function template overloads do not cause problems
158 // when the comparison function is not transparent.
162 operator int() const { return i
; }
173 // PR libstdc++/78273
176 bool operator()(int l
, int r
) const { return l
< r
; }
178 struct Partition
{ };
180 bool operator()(int l
, Partition
) const { return l
< 2; }
181 bool operator()(Partition
, int r
) const { return 4 < r
; }
183 using is_transparent
= void;
186 std::set
<int, C
> s
{ 1, 2, 3, 4, 5 };
188 auto n
= s
.count(C::Partition
{});