@@ -37,6 +37,15 @@ struct indestructible_int {
37
37
~indestructible_int () = default ;
38
38
};
39
39
40
+ struct base {
41
+ virtual int get () { return 10 ; }
42
+ virtual ~base () = default ;
43
+ };
44
+
45
+ struct derived : public base {
46
+ int get () override { return 100 ; }
47
+ };
48
+
40
49
} // namespace helpers
41
50
42
51
TEST_CASE (" from_raw_ptr_unowned+as_raw_ptr_unowned" , " [S]" ) {
@@ -227,6 +236,25 @@ TEST_CASE("from_unique_ptr+as_shared_ptr", "[S]") {
227
236
REQUIRE (*new_owner == 19 );
228
237
}
229
238
239
+ TEST_CASE (" from_unique_ptr_derived+as_unique_ptr_base" , " [S]" ) {
240
+ std::unique_ptr<helpers::derived> orig_owner (new helpers::derived ());
241
+ auto hld = smart_holder::from_unique_ptr (std::move (orig_owner));
242
+ REQUIRE (orig_owner.get () == nullptr );
243
+ std::unique_ptr<helpers::base> new_owner = hld.as_unique_ptr <helpers::base>();
244
+ REQUIRE (!hld.has_pointee ());
245
+ REQUIRE (new_owner->get () == 100 );
246
+ }
247
+
248
+ TEST_CASE (" from_unique_ptr_derived+as_unique_ptr_base2" , " [E]" ) {
249
+ std::unique_ptr<helpers::derived, helpers::functor_other_delete<helpers::derived>> orig_owner (
250
+ new helpers::derived ());
251
+ auto hld = smart_holder::from_unique_ptr (std::move (orig_owner));
252
+ REQUIRE (orig_owner.get () == nullptr );
253
+ REQUIRE_THROWS_WITH (
254
+ (hld.as_unique_ptr <helpers::base, helpers::functor_builtin_delete<helpers::base>>()),
255
+ " Incompatible unique_ptr deleter (as_unique_ptr)." );
256
+ }
257
+
230
258
TEST_CASE (" from_unique_ptr_with_deleter+as_lvalue_ref" , " [S]" ) {
231
259
std::unique_ptr<int , helpers::functor_builtin_delete<int >> orig_owner (new int (19 ));
232
260
auto hld = smart_holder::from_unique_ptr (std::move (orig_owner));
0 commit comments