@@ -624,15 +624,18 @@ struct smart_holder_type_caster<std::shared_ptr<T>> : smart_holder_type_caster_l
624
624
625
625
static handle cast (const std::shared_ptr<T> &src, return_value_policy policy, handle parent) {
626
626
if (policy != return_value_policy::automatic
627
- && policy != return_value_policy::reference_internal) {
627
+ && policy != return_value_policy::reference_internal
628
+ && policy != return_value_policy::automatic_reference) {
628
629
// SMART_HOLDER_WIP: IMPROVABLE: Error message.
629
630
throw cast_error (" Invalid return_value_policy for shared_ptr." );
630
631
}
632
+ if (!src)
633
+ return none ().release ();
631
634
632
635
auto src_raw_ptr = src.get ();
633
636
auto st = type_caster_base<T>::src_and_type (src_raw_ptr);
634
- if (st.first == nullptr )
635
- return none (). release () ; // PyErr was set already.
637
+ if (st.second == nullptr )
638
+ return handle () ; // no type info: error will be set already
636
639
637
640
void *src_raw_void_ptr = static_cast <void *>(src_raw_ptr);
638
641
const detail::type_info *tinfo = st.second ;
@@ -693,11 +696,13 @@ struct smart_holder_type_caster<std::unique_ptr<T, D>> : smart_holder_type_caste
693
696
// SMART_HOLDER_WIP: IMPROVABLE: Error message.
694
697
throw cast_error (" Invalid return_value_policy for unique_ptr." );
695
698
}
699
+ if (!src)
700
+ return none ().release ();
696
701
697
702
auto src_raw_ptr = src.get ();
698
703
auto st = type_caster_base<T>::src_and_type (src_raw_ptr);
699
- if (st.first == nullptr )
700
- return none (). release () ; // PyErr was set already.
704
+ if (st.second == nullptr )
705
+ return handle () ; // no type info: error will be set already
701
706
702
707
void *src_raw_void_ptr = static_cast <void *>(src_raw_ptr);
703
708
const detail::type_info *tinfo = st.second ;
0 commit comments