1 // { dg-do run { target c++11 } } 2 3 // Copyright (C) 2013-2019 Free Software Foundation, Inc. 4 // 5 // This file is part of the GNU ISO C++ Library. This library is free 6 // software; you can redistribute it and/or modify it under the 7 // terms of the GNU General Public License as published by the 8 // Free Software Foundation; either version 3, or (at your option) 9 // any later version. 10 11 // This library is distributed in the hope that it will be useful, 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 // GNU General Public License for more details. 15 16 // You should have received a copy of the GNU General Public License along 17 // with this library; see the file COPYING3. If not see 18 // <http://www.gnu.org/licenses/>. 19 20 #include <memory> 21 #include <ext/pointer.h> 22 #include <testsuite_hooks.h> 23 24 struct X : public std::enable_shared_from_this<X> { }; 25 test01()26void test01() 27 { 28 std::unique_ptr<X> up(new X); 29 X* xp = up.get(); 30 std::shared_ptr<X> sp(std::move(up)); 31 VERIFY( xp->shared_from_this() != nullptr ); 32 } 33 34 using __gnu_cxx::_Pointer_adapter; 35 using __gnu_cxx::_Std_pointer_impl; 36 37 struct Deleter 38 { 39 struct pointer : _Pointer_adapter<_Std_pointer_impl<X>> 40 { 41 using _Pointer_adapter::_Pointer_adapter; operator X*Deleter::pointer42 operator X*() const noexcept { return this->get(); } 43 }; 44 operator ()Deleter45 void operator()(pointer p) const noexcept { delete (X*)p; } 46 }; 47 test02()48void test02() 49 { 50 std::unique_ptr<X, Deleter> up(new X); 51 Deleter::pointer xp = up.get(); 52 // Creating shared_ptr from unique_ptr with custom pointer is an extension: 53 std::shared_ptr<X> sp(std::move(up)); 54 // but enable_shared_from_this should still work: 55 VERIFY( xp->shared_from_this() != nullptr ); 56 } 57 main()58int main() 59 { 60 test01(); 61 test02(); 62 } 63