mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-14 01:23:53 +00:00
Fix casts to void* (#4275)
* Fix casts to void* * Improve tests * style: pre-commit fixes * remove c style cast Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Aaron Gokaslan <aaronGokaslan@gmail.com>
This commit is contained in:
parent
17c1e27b3d
commit
8ea75ab4d7
@ -1179,11 +1179,9 @@ enable_if_t<cast_is_temporary_value_reference<T>::value, T> cast_safe(object &&)
|
|||||||
pybind11_fail("Internal error: cast_safe fallback invoked");
|
pybind11_fail("Internal error: cast_safe fallback invoked");
|
||||||
}
|
}
|
||||||
template <typename T>
|
template <typename T>
|
||||||
enable_if_t<std::is_same<void, intrinsic_t<T>>::value, void> cast_safe(object &&) {}
|
enable_if_t<std::is_void<T>::value, void> cast_safe(object &&) {}
|
||||||
template <typename T>
|
template <typename T>
|
||||||
enable_if_t<detail::none_of<cast_is_temporary_value_reference<T>,
|
enable_if_t<detail::none_of<cast_is_temporary_value_reference<T>, std::is_void<T>>::value, T>
|
||||||
std::is_same<void, intrinsic_t<T>>>::value,
|
|
||||||
T>
|
|
||||||
cast_safe(object &&o) {
|
cast_safe(object &&o) {
|
||||||
return pybind11::cast<T>(std::move(o));
|
return pybind11::cast<T>(std::move(o));
|
||||||
}
|
}
|
||||||
|
@ -384,6 +384,8 @@ TEST_SUBMODULE(class_, m) {
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual int foo() const { return value; }
|
virtual int foo() const { return value; }
|
||||||
|
virtual void *void_foo() { return static_cast<void *>(&value); }
|
||||||
|
virtual void *get_self() { return static_cast<void *>(this); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int value = 42;
|
int value = 42;
|
||||||
@ -392,6 +394,8 @@ TEST_SUBMODULE(class_, m) {
|
|||||||
class TrampolineB : public ProtectedB {
|
class TrampolineB : public ProtectedB {
|
||||||
public:
|
public:
|
||||||
int foo() const override { PYBIND11_OVERRIDE(int, ProtectedB, foo, ); }
|
int foo() const override { PYBIND11_OVERRIDE(int, ProtectedB, foo, ); }
|
||||||
|
void *void_foo() override { PYBIND11_OVERRIDE(void *, ProtectedB, void_foo, ); }
|
||||||
|
void *get_self() override { PYBIND11_OVERRIDE(void *, ProtectedB, get_self, ); }
|
||||||
};
|
};
|
||||||
|
|
||||||
class PublicistB : public ProtectedB {
|
class PublicistB : public ProtectedB {
|
||||||
@ -401,11 +405,23 @@ TEST_SUBMODULE(class_, m) {
|
|||||||
// (in Debug builds only, tested with icpc (ICC) 2021.1 Beta 20200827)
|
// (in Debug builds only, tested with icpc (ICC) 2021.1 Beta 20200827)
|
||||||
~PublicistB() override{}; // NOLINT(modernize-use-equals-default)
|
~PublicistB() override{}; // NOLINT(modernize-use-equals-default)
|
||||||
using ProtectedB::foo;
|
using ProtectedB::foo;
|
||||||
|
using ProtectedB::get_self;
|
||||||
|
using ProtectedB::void_foo;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
m.def("read_foo", [](const void *original) {
|
||||||
|
const int *ptr = reinterpret_cast<const int *>(original);
|
||||||
|
return *ptr;
|
||||||
|
});
|
||||||
|
|
||||||
|
m.def("pointers_equal",
|
||||||
|
[](const void *original, const void *comparison) { return original == comparison; });
|
||||||
|
|
||||||
py::class_<ProtectedB, TrampolineB>(m, "ProtectedB")
|
py::class_<ProtectedB, TrampolineB>(m, "ProtectedB")
|
||||||
.def(py::init<>())
|
.def(py::init<>())
|
||||||
.def("foo", &PublicistB::foo);
|
.def("foo", &PublicistB::foo)
|
||||||
|
.def("void_foo", &PublicistB::void_foo)
|
||||||
|
.def("get_self", &PublicistB::get_self);
|
||||||
|
|
||||||
// test_brace_initialization
|
// test_brace_initialization
|
||||||
struct BraceInitialization {
|
struct BraceInitialization {
|
||||||
|
@ -313,6 +313,8 @@ def test_bind_protected_functions():
|
|||||||
|
|
||||||
b = m.ProtectedB()
|
b = m.ProtectedB()
|
||||||
assert b.foo() == 42
|
assert b.foo() == 42
|
||||||
|
assert m.read_foo(b.void_foo()) == 42
|
||||||
|
assert m.pointers_equal(b.get_self(), b)
|
||||||
|
|
||||||
class C(m.ProtectedB):
|
class C(m.ProtectedB):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
Loading…
Reference in New Issue
Block a user