@@ -164,4 +164,65 @@ int main() {
164164 auto bound7 = move (bound6);
165165 assert (*move (bound6)() == -9000 );
166166 assert (*move (bound7)() == 1234 );
167+
168+ // Also test GH-1292 "bind_front violates [func.require]p8" in which the return type of bind_front inadvertently
169+ // depends on the value category and/or cv-qualification of its arguments.
170+ {
171+ struct S {
172+ int i = 42 ;
173+ };
174+ S s;
175+ auto lambda = [](S x) { return x.i ; };
176+ auto returns_lambda = [=] { return lambda; };
177+ auto returns_const_lambda = [=]() -> const decltype (lambda) { return lambda; };
178+ auto returns_const_S = []() -> const S { return {}; };
179+
180+ using T = decltype (bind_front (lambda, s));
181+ static_assert (is_same_v<decltype (bind_front (lambda, move (s))), T>);
182+ static_assert (is_same_v<decltype (bind_front (lambda, S{})), T>);
183+
184+ static_assert (is_same_v<decltype (bind_front (move (lambda), s)), T>);
185+ static_assert (is_same_v<decltype (bind_front (move (lambda), move (s))), T>);
186+ static_assert (is_same_v<decltype (bind_front (move (lambda), S{})), T>);
187+
188+ static_assert (is_same_v<decltype (bind_front (returns_lambda (), s)), T>);
189+ static_assert (is_same_v<decltype (bind_front (returns_lambda (), move (s))), T>);
190+ static_assert (is_same_v<decltype (bind_front (returns_lambda (), S{})), T>);
191+
192+ static_assert (is_same_v<decltype (bind_front (lambda, as_const (s))), T>);
193+ static_assert (is_same_v<decltype (bind_front (lambda, move (as_const (s)))), T>);
194+ static_assert (is_same_v<decltype (bind_front (lambda, returns_const_S ())), T>);
195+
196+ static_assert (is_same_v<decltype (bind_front (move (lambda), as_const (s))), T>);
197+ static_assert (is_same_v<decltype (bind_front (move (lambda), move (as_const (s)))), T>);
198+ static_assert (is_same_v<decltype (bind_front (move (lambda), returns_const_S ())), T>);
199+
200+ static_assert (is_same_v<decltype (bind_front (returns_lambda (), as_const (s))), T>);
201+ static_assert (is_same_v<decltype (bind_front (returns_lambda (), move (as_const (s)))), T>);
202+ static_assert (is_same_v<decltype (bind_front (returns_lambda (), returns_const_S ())), T>);
203+
204+ static_assert (is_same_v<decltype (bind_front (as_const (lambda), s)), T>);
205+ static_assert (is_same_v<decltype (bind_front (as_const (lambda), move (s))), T>);
206+ static_assert (is_same_v<decltype (bind_front (as_const (lambda), S{})), T>);
207+
208+ static_assert (is_same_v<decltype (bind_front (move (as_const (lambda)), s)), T>);
209+ static_assert (is_same_v<decltype (bind_front (move (as_const (lambda)), move (s))), T>);
210+ static_assert (is_same_v<decltype (bind_front (move (as_const (lambda)), S{})), T>);
211+
212+ static_assert (is_same_v<decltype (bind_front (returns_const_lambda (), s)), T>);
213+ static_assert (is_same_v<decltype (bind_front (returns_const_lambda (), move (s))), T>);
214+ static_assert (is_same_v<decltype (bind_front (returns_const_lambda (), S{})), T>);
215+
216+ static_assert (is_same_v<decltype (bind_front (as_const (lambda), as_const (s))), T>);
217+ static_assert (is_same_v<decltype (bind_front (as_const (lambda), move (as_const (s)))), T>);
218+ static_assert (is_same_v<decltype (bind_front (as_const (lambda), returns_const_S ())), T>);
219+
220+ static_assert (is_same_v<decltype (bind_front (move (as_const (lambda)), as_const (s))), T>);
221+ static_assert (is_same_v<decltype (bind_front (move (as_const (lambda)), move (as_const (s)))), T>);
222+ static_assert (is_same_v<decltype (bind_front (move (as_const (lambda)), returns_const_S ())), T>);
223+
224+ static_assert (is_same_v<decltype (bind_front (returns_const_lambda (), as_const (s))), T>);
225+ static_assert (is_same_v<decltype (bind_front (returns_const_lambda (), move (as_const (s)))), T>);
226+ static_assert (is_same_v<decltype (bind_front (returns_const_lambda (), returns_const_S ())), T>);
227+ }
167228}
0 commit comments