mirror of
https://github.com/pybind/pybind11.git
synced 2025-02-18 14:40:49 +00:00
Merge branch 'pybind:master' into master
This commit is contained in:
commit
92d00b1cf2
@ -84,6 +84,7 @@ struct op_impl {};
|
|||||||
/// Operator implementation generator
|
/// Operator implementation generator
|
||||||
template <op_id id, op_type ot, typename L, typename R>
|
template <op_id id, op_type ot, typename L, typename R>
|
||||||
struct op_ {
|
struct op_ {
|
||||||
|
static constexpr bool op_enable_if_hook = true;
|
||||||
template <typename Class, typename... Extra>
|
template <typename Class, typename... Extra>
|
||||||
void execute(Class &cl, const Extra &...extra) const {
|
void execute(Class &cl, const Extra &...extra) const {
|
||||||
using Base = typename Class::type;
|
using Base = typename Class::type;
|
||||||
|
@ -1578,34 +1578,17 @@ public:
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Nvidia's NVCC is broken between 11.4.0 and 11.8.0
|
template <typename T, typename... Extra, detail::enable_if_t<T::op_enable_if_hook, int> = 0>
|
||||||
// https://github.com/pybind/pybind11/issues/4193
|
|
||||||
#if defined(__CUDACC__) && (__CUDACC_VER_MAJOR__ == 11) && (__CUDACC_VER_MINOR__ >= 4) \
|
|
||||||
&& (__CUDACC_VER_MINOR__ <= 8)
|
|
||||||
template <typename T, typename... Extra>
|
|
||||||
class_ &def(const T &op, const Extra &...extra) {
|
class_ &def(const T &op, const Extra &...extra) {
|
||||||
op.execute(*this, extra...);
|
op.execute(*this, extra...);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, typename... Extra>
|
template <typename T, typename... Extra, detail::enable_if_t<T::op_enable_if_hook, int> = 0>
|
||||||
class_ &def_cast(const T &op, const Extra &...extra) {
|
class_ &def_cast(const T &op, const Extra &...extra) {
|
||||||
op.execute_cast(*this, extra...);
|
op.execute_cast(*this, extra...);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
template <detail::op_id id, detail::op_type ot, typename L, typename R, typename... Extra>
|
|
||||||
class_ &def(const detail::op_<id, ot, L, R> &op, const Extra &...extra) {
|
|
||||||
op.execute(*this, extra...);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <detail::op_id id, detail::op_type ot, typename L, typename R, typename... Extra>
|
|
||||||
class_ &def_cast(const detail::op_<id, ot, L, R> &op, const Extra &...extra) {
|
|
||||||
op.execute_cast(*this, extra...);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
template <typename... Args, typename... Extra>
|
template <typename... Args, typename... Extra>
|
||||||
class_ &def(const detail::initimpl::constructor<Args...> &init, const Extra &...extra) {
|
class_ &def(const detail::initimpl::constructor<Args...> &init, const Extra &...extra) {
|
||||||
|
@ -36,6 +36,26 @@ struct NoBraceInitialization {
|
|||||||
std::vector<int> vec;
|
std::vector<int> vec;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
namespace test_class {
|
||||||
|
namespace pr4220_tripped_over_this { // PR #4227
|
||||||
|
|
||||||
|
template <int>
|
||||||
|
struct SoEmpty {};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
std::string get_msg(const T &) {
|
||||||
|
return "This is really only meant to exercise successful compilation.";
|
||||||
|
}
|
||||||
|
|
||||||
|
using Empty0 = SoEmpty<0x0>;
|
||||||
|
|
||||||
|
void bind_empty0(py::module_ &m) {
|
||||||
|
py::class_<Empty0>(m, "Empty0").def(py::init<>()).def("get_msg", get_msg<Empty0>);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace pr4220_tripped_over_this
|
||||||
|
} // namespace test_class
|
||||||
|
|
||||||
TEST_SUBMODULE(class_, m) {
|
TEST_SUBMODULE(class_, m) {
|
||||||
// test_instance
|
// test_instance
|
||||||
struct NoConstructor {
|
struct NoConstructor {
|
||||||
@ -517,6 +537,8 @@ TEST_SUBMODULE(class_, m) {
|
|||||||
py::class_<OtherDuplicateNested>(gt, "OtherDuplicateNested");
|
py::class_<OtherDuplicateNested>(gt, "OtherDuplicateNested");
|
||||||
py::class_<OtherDuplicateNested>(gt, "YetAnotherDuplicateNested");
|
py::class_<OtherDuplicateNested>(gt, "YetAnotherDuplicateNested");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test_class::pr4220_tripped_over_this::bind_empty0(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <int N>
|
template <int N>
|
||||||
|
@ -469,3 +469,10 @@ def test_register_duplicate_class():
|
|||||||
m.register_duplicate_nested_class_type(ClassScope)
|
m.register_duplicate_nested_class_type(ClassScope)
|
||||||
expected = 'generic_type: type "YetAnotherDuplicateNested" is already registered!'
|
expected = 'generic_type: type "YetAnotherDuplicateNested" is already registered!'
|
||||||
assert str(exc_info.value) == expected
|
assert str(exc_info.value) == expected
|
||||||
|
|
||||||
|
|
||||||
|
def test_pr4220_tripped_over_this():
|
||||||
|
assert (
|
||||||
|
m.Empty0().get_msg()
|
||||||
|
== "This is really only meant to exercise successful compilation."
|
||||||
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user