Skip to content

Commit 94e6b4b

Browse files
rwgkcursoragent
andcommitted
Add compile-only overload_cast guard for ref-qualified methods.
This was added as a maintenance follow-up to the qualifier-consistency work, so future changes that introduce overload_cast ambiguity or wrong ref/noexcept resolution fail at compile time. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 35584e0 commit 94e6b4b

1 file changed

Lines changed: 42 additions & 0 deletions

File tree

tests/test_methods_and_attributes.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,48 @@ struct RefQualifiedOverloaded {
237237
#endif
238238
};
239239

240+
// Compile-only guard: catch overload_cast resolution regressions/ambiguities early.
241+
using RefQualifiedOverloadedIntCast = py::detail::overload_cast_impl<int>;
242+
using RefQualifiedOverloadedFloatCast = py::detail::overload_cast_impl<float>;
243+
static_assert(
244+
std::is_same<decltype(RefQualifiedOverloadedIntCast{}(&RefQualifiedOverloaded::method)),
245+
py::str (RefQualifiedOverloaded::*)(int) &>::value,
246+
"");
247+
static_assert(std::is_same<decltype(RefQualifiedOverloadedIntCast{}(
248+
&RefQualifiedOverloaded::method, py::const_)),
249+
py::str (RefQualifiedOverloaded::*)(int) const &>::value,
250+
"");
251+
static_assert(
252+
std::is_same<decltype(RefQualifiedOverloadedFloatCast{}(&RefQualifiedOverloaded::method)),
253+
py::str (RefQualifiedOverloaded::*)(float) &&>::value,
254+
"");
255+
static_assert(std::is_same<decltype(RefQualifiedOverloadedFloatCast{}(
256+
&RefQualifiedOverloaded::method, py::const_)),
257+
py::str (RefQualifiedOverloaded::*)(float) const &&>::value,
258+
"");
259+
260+
#ifdef __cpp_noexcept_function_type
261+
using RefQualifiedOverloadedLongCast = py::detail::overload_cast_impl<long>;
262+
using RefQualifiedOverloadedDoubleCast = py::detail::overload_cast_impl<double>;
263+
static_assert(
264+
std::is_same<decltype(RefQualifiedOverloadedLongCast{}(&RefQualifiedOverloaded::method)),
265+
py::str (RefQualifiedOverloaded::*)(long) & noexcept>::value,
266+
"");
267+
static_assert(std::is_same<decltype(RefQualifiedOverloadedLongCast{}(
268+
&RefQualifiedOverloaded::method, py::const_)),
269+
py::str (RefQualifiedOverloaded::*)(long) const & noexcept>::value,
270+
"");
271+
static_assert(std::is_same
272+
< decltype(RefQualifiedOverloadedDoubleCast{}(&RefQualifiedOverloaded::method)),
273+
py::str (RefQualifiedOverloaded::*)(double) && noexcept > ::value,
274+
"");
275+
static_assert(std::is_same
276+
< decltype(RefQualifiedOverloadedDoubleCast{}(&RefQualifiedOverloaded::method,
277+
py::const_)),
278+
py::str (RefQualifiedOverloaded::*)(double) const && noexcept > ::value,
279+
"");
280+
#endif
281+
240282
// Test explicit lvalue ref-qualification
241283
struct RefQualified {
242284
int value = 0;

0 commit comments

Comments
 (0)