Skip to content

Commit 275aaf9

Browse files
committed
Inserting const_cast for std::get_deleter return, to keep Ubuntu 20 GCC 6.3.0 happy.
1 parent b04a70b commit 275aaf9

File tree

1 file changed

+15
-25
lines changed

1 file changed

+15
-25
lines changed

include/pybind11/detail/smart_holder_poc.h

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,8 @@ namespace memory {
5959
struct guarded_operator_call {
6060
bool armed_flag;
6161
explicit guarded_operator_call(bool armed_flag) : armed_flag{armed_flag} {}
62-
virtual void operator()(void *) = 0;
63-
virtual ~guarded_operator_call() = default;
64-
guarded_operator_call(guarded_operator_call &&) = default;
65-
guarded_operator_call(guarded_operator_call &) = default;
66-
guarded_operator_call &operator=(guarded_operator_call &&) = delete;
67-
guarded_operator_call &operator=(const guarded_operator_call &) = delete;
62+
virtual void operator()(void *) = 0;
63+
virtual ~guarded_operator_call() = default;
6864
};
6965

7066
template <typename T>
@@ -214,20 +210,25 @@ struct smart_holder {
214210
}
215211
}
216212

213+
template <typename T, typename D>
214+
void vptr_reset(T *raw_ptr, const D &del) {
215+
vptr.reset(raw_ptr, del); // Copies del.
216+
// The const_cast is only for certain compilers (Ubuntu 20 GCC 6.3.0 being one).
217+
vptr_del = const_cast<D *>(std::get_deleter<D>(vptr)); // Pointer to copy of del.
218+
}
219+
217220
void reset_vptr_deleter_armed_flag(bool armed_flag) const {
218-
auto vptr_del_ptr = std::get_deleter<guarded_delete>(vptr);
219-
if (vptr_del_ptr == nullptr) {
221+
if (vptr_del == nullptr) {
220222
throw std::runtime_error(
221223
"smart_holder::reset_vptr_deleter_armed_flag() called in an invalid context.");
222224
}
223-
vptr_del_ptr->armed_flag = armed_flag;
225+
vptr_del->armed_flag = armed_flag;
224226
}
225227

226228
template <typename T>
227229
static smart_holder from_raw_ptr_unowned(T *raw_ptr) {
228230
smart_holder hld;
229-
hld.vptr.reset(raw_ptr, guarded_builtin_delete<T>(false));
230-
hld.vptr_del = std::get_deleter<guarded_builtin_delete<T>>(hld.vptr);
231+
hld.vptr_reset(raw_ptr, guarded_builtin_delete<T>(false));
231232
hld.vptr_is_using_noop_deleter = true;
232233
hld.is_populated = true;
233234
return hld;
@@ -258,21 +259,12 @@ struct smart_holder {
258259
static smart_holder from_raw_ptr_take_ownership(T *raw_ptr) {
259260
ensure_pointee_is_destructible<T>("from_raw_ptr_take_ownership");
260261
smart_holder hld;
261-
hld.vptr.reset(raw_ptr, guarded_builtin_delete<T>(true));
262-
hld.vptr_del = std::get_deleter<guarded_builtin_delete<T>>(hld.vptr);
262+
hld.vptr_reset(raw_ptr, guarded_builtin_delete<T>(true));
263263
hld.vptr_is_using_builtin_delete = true;
264264
hld.is_populated = true;
265265
return hld;
266266
}
267267

268-
void reset_vptr_deleter_armed_flag(bool armed_flag) {
269-
if (vptr_del == nullptr) {
270-
throw std::runtime_error(
271-
"smart_holder::reset_vptr_deleter_armed_flag() called in an invalid context.");
272-
}
273-
vptr_del->armed_flag = armed_flag;
274-
}
275-
276268
// Caller is responsible for ensuring preconditions (SMART_HOLDER_WIP: details).
277269
void disown() {
278270
reset_vptr_deleter_armed_flag(false);
@@ -318,11 +310,9 @@ struct smart_holder {
318310
hld.rtti_uqp_del = &typeid(D);
319311
hld.vptr_is_using_builtin_delete = is_std_default_delete<T>(*hld.rtti_uqp_del);
320312
if (hld.vptr_is_using_builtin_delete) {
321-
hld.vptr.reset(unq_ptr.get(), guarded_builtin_delete<T>(true));
322-
hld.vptr_del = std::get_deleter<guarded_builtin_delete<T>>(hld.vptr);
313+
hld.vptr_reset(unq_ptr.get(), guarded_builtin_delete<T>(true));
323314
} else {
324-
hld.vptr.reset(unq_ptr.get(), guarded_custom_deleter<T, D>(true));
325-
hld.vptr_del = std::get_deleter<guarded_custom_deleter<T, D>>(hld.vptr);
315+
hld.vptr_reset(unq_ptr.get(), guarded_custom_deleter<T, D>(true));
326316
}
327317
unq_ptr.release();
328318
hld.is_populated = true;

0 commit comments

Comments
 (0)