shared_ptr_base.h (__shared_count(unique_ptr&&)): Check for nullptr (LWG 2415).
* include/bits/shared_ptr_base.h (__shared_count(unique_ptr&&)): Check for nullptr (LWG 2415). * testsuite/20_util/shared_ptr/cons/unique_ptr_deleter.cc: Test construction from empty unique_ptr. * testsuite/20_util/shared_ptr/cons/43820_neg.cc: Adjust dg-error. * testsuite/20_util/shared_ptr/cons/void_neg.cc: Likewise. From-SVN: r223170
This commit is contained in:
parent
b7dce216c7
commit
098aac94ef
@ -1,5 +1,12 @@
|
|||||||
2015-05-13 Jonathan Wakely <jwakely@redhat.com>
|
2015-05-13 Jonathan Wakely <jwakely@redhat.com>
|
||||||
|
|
||||||
|
* include/bits/shared_ptr_base.h (__shared_count(unique_ptr&&)): Check
|
||||||
|
for nullptr (LWG 2415).
|
||||||
|
* testsuite/20_util/shared_ptr/cons/unique_ptr_deleter.cc: Test
|
||||||
|
construction from empty unique_ptr.
|
||||||
|
* testsuite/20_util/shared_ptr/cons/43820_neg.cc: Adjust dg-error.
|
||||||
|
* testsuite/20_util/shared_ptr/cons/void_neg.cc: Likewise.
|
||||||
|
|
||||||
* include/bits/stl_raw_storage_iter.h (raw_storage_iterator::base()):
|
* include/bits/stl_raw_storage_iter.h (raw_storage_iterator::base()):
|
||||||
Define (LWG 2454).
|
Define (LWG 2454).
|
||||||
* testsuite/20_util/raw_storage_iterator/base.cc: New.
|
* testsuite/20_util/raw_storage_iterator/base.cc: New.
|
||||||
|
@ -632,6 +632,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||||||
explicit
|
explicit
|
||||||
__shared_count(std::unique_ptr<_Tp, _Del>&& __r) : _M_pi(0)
|
__shared_count(std::unique_ptr<_Tp, _Del>&& __r) : _M_pi(0)
|
||||||
{
|
{
|
||||||
|
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||||
|
// 2415. Inconsistency between unique_ptr and shared_ptr
|
||||||
|
if (__r.get() == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
using _Ptr = typename unique_ptr<_Tp, _Del>::pointer;
|
using _Ptr = typename unique_ptr<_Tp, _Del>::pointer;
|
||||||
using _Del2 = typename conditional<is_reference<_Del>::value,
|
using _Del2 = typename conditional<is_reference<_Del>::value,
|
||||||
reference_wrapper<typename remove_reference<_Del>::type>,
|
reference_wrapper<typename remove_reference<_Del>::type>,
|
||||||
|
@ -32,7 +32,7 @@ void test01()
|
|||||||
{
|
{
|
||||||
X* px = 0;
|
X* px = 0;
|
||||||
std::shared_ptr<X> p1(px); // { dg-error "here" }
|
std::shared_ptr<X> p1(px); // { dg-error "here" }
|
||||||
// { dg-error "incomplete" "" { target *-*-* } 886 }
|
// { dg-error "incomplete" "" { target *-*-* } 891 }
|
||||||
|
|
||||||
std::shared_ptr<X> p9(ap()); // { dg-error "here" }
|
std::shared_ptr<X> p9(ap()); // { dg-error "here" }
|
||||||
// { dg-error "incomplete" "" { target *-*-* } 307 }
|
// { dg-error "incomplete" "" { target *-*-* } 307 }
|
||||||
|
@ -34,7 +34,7 @@ int D::count = 0;
|
|||||||
// 20.7.12.2.1 shared_ptr constructors [util.smartptr.shared.const]
|
// 20.7.12.2.1 shared_ptr constructors [util.smartptr.shared.const]
|
||||||
|
|
||||||
// Construction from unique_ptr
|
// Construction from unique_ptr
|
||||||
int
|
void
|
||||||
test01()
|
test01()
|
||||||
{
|
{
|
||||||
bool test __attribute__((unused)) = true;
|
bool test __attribute__((unused)) = true;
|
||||||
@ -47,13 +47,25 @@ test01()
|
|||||||
VERIFY( sp.use_count() == 1 );
|
VERIFY( sp.use_count() == 1 );
|
||||||
}
|
}
|
||||||
VERIFY( D::count == 1 );
|
VERIFY( D::count == 1 );
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
void
|
||||||
|
test02()
|
||||||
|
{
|
||||||
|
bool test __attribute__((unused)) = true;
|
||||||
|
|
||||||
|
D::count = 0;
|
||||||
|
std::unique_ptr<A, D> up;
|
||||||
|
{
|
||||||
|
std::shared_ptr<A> sp = std::move(up);
|
||||||
|
}
|
||||||
|
VERIFY( D::count == 0 ); // LWG 2415
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main()
|
main()
|
||||||
{
|
{
|
||||||
test01();
|
test01();
|
||||||
|
test02();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -25,5 +25,5 @@
|
|||||||
void test01()
|
void test01()
|
||||||
{
|
{
|
||||||
std::shared_ptr<void> p((void*)nullptr); // { dg-error "here" }
|
std::shared_ptr<void> p((void*)nullptr); // { dg-error "here" }
|
||||||
// { dg-error "incomplete" "" { target *-*-* } 885 }
|
// { dg-error "incomplete" "" { target *-*-* } 890 }
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user