* [v3] Add unique_ptr(auto_ptr<_Up>&&) + contraints
@ 2010-08-10 12:30 Paolo Carlini
2010-08-10 16:33 ` Jonathan Wakely
0 siblings, 1 reply; 4+ messages in thread
From: Paolo Carlini @ 2010-08-10 12:30 UTC (permalink / raw)
To: gcc-patches; +Cc: libstdc++
[-- Attachment #1: Type: text/plain, Size: 289 bytes --]
Hi,
I checked our smart pointers vs US 108 and went add adding the
unique_ptr constructor from auto_ptr which we were missing. I also added
some missing constraining to the member functions of those classes.
Tested x86_64-linux, committed to mainline.
Paolo.
/////////////////////////
[-- Attachment #2: CL_us108_rel --]
[-- Type: text/plain, Size: 1041 bytes --]
2010-08-10 Paolo Carlini <paolo.carlini@oracle.com>
* testsuite/20_util/ratio/cons/cons_overflow_neg.cc: Avoid -Wall
warnings.
* include/bits/shared_ptr.h (shared_ptr<>::shared_ptr
(const shared_ptr<>&), shared_ptr(shared_ptr<>&&), weak_ptr<>::
weak_ptr(const weak_ptr<>&), weak_ptr(const shared_ptr<>&)):
Constrain appropriately via std::is_convertible, etc.
* include/bits/shared_ptr_base.h: Likewise.
* include/bits/unique_ptr.h (default_delete<>::
default_delete(const default_delete<>&),
unique_ptr<>::unique_ptr(unique_ptr<>&&), operator=(unique_ptr<>&&)):
Likewise.
* testsuite/20_util/weak_ptr/comparison/cmp_neg.cc: Adjust dg-error
line numbers.
* testsuite/20_util/shared_ptr/cons/43820.cc: Likewise.
* include/bits/unique_ptr.h (unique_ptr<>::unique_ptr(auto_ptr<>&&)):
Add.
* include/std/memory: Adjust includes order.
* testsuite/20_util/unique_ptr/cons/auto_ptr.cc: New.
* testsuite/20_util/unique_ptr/cons/auto_ptr_neg.cc: Likewise.
* testsuite/20_util/shared_ptr/cons/auto_ptr_neg.cc: Minor tweaks.
[-- Attachment #3: patch_us108_rel --]
[-- Type: text/plain, Size: 12663 bytes --]
Index: include/std/memory
===================================================================
--- include/std/memory (revision 163048)
+++ include/std/memory (working copy)
@@ -1,6 +1,7 @@
// <memory> -*- C++ -*-
-// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
+// 2009, 2010
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -81,10 +82,10 @@
# include <type_traits>
# include <functional>
# include <debug/debug.h>
-# include <bits/unique_ptr.h>
# if _GLIBCXX_DEPRECATED
# include <backward/auto_ptr.h>
# endif
+# include <bits/unique_ptr.h>
# if defined(_GLIBCXX_INCLUDE_AS_CXX0X)
# include <tr1_impl/boost_sp_counted_base.h>
# else
Index: include/bits/shared_ptr.h
===================================================================
--- include/bits/shared_ptr.h (revision 163048)
+++ include/bits/shared_ptr.h (working copy)
@@ -206,8 +206,10 @@
* @param __r A %shared_ptr.
* @post get() == __r.get() && use_count() == __r.use_count()
*/
- template<typename _Tp1>
- shared_ptr(const shared_ptr<_Tp1>& __r) : __shared_ptr<_Tp>(__r) { }
+ template<typename _Tp1, typename = typename
+ std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type>
+ shared_ptr(const shared_ptr<_Tp1>& __r)
+ : __shared_ptr<_Tp>(__r) { }
/**
* @brief Move-constructs a %shared_ptr instance from @a __r.
@@ -222,7 +224,8 @@
* @param __r A %shared_ptr rvalue.
* @post *this contains the old value of @a __r, @a __r is empty.
*/
- template<typename _Tp1>
+ template<typename _Tp1, typename = typename
+ std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type>
shared_ptr(shared_ptr<_Tp1>&& __r)
: __shared_ptr<_Tp>(std::move(__r)) { }
@@ -366,11 +369,13 @@
public:
weak_ptr() : __weak_ptr<_Tp>() { }
- template<typename _Tp1>
+ template<typename _Tp1, typename = typename
+ std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type>
weak_ptr(const weak_ptr<_Tp1>& __r)
: __weak_ptr<_Tp>(__r) { }
- template<typename _Tp1>
+ template<typename _Tp1, typename = typename
+ std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type>
weak_ptr(const shared_ptr<_Tp1>& __r)
: __weak_ptr<_Tp>(__r) { }
Index: include/bits/unique_ptr.h
===================================================================
--- include/bits/unique_ptr.h (revision 163048)
+++ include/bits/unique_ptr.h (working copy)
@@ -49,7 +49,8 @@
{
default_delete() { }
- template<typename _Up>
+ template<typename _Up, typename = typename
+ std::enable_if<std::is_convertible<_Up*, _Tp*>::value>::type>
default_delete(const default_delete<_Up>&) { }
void
@@ -133,14 +134,32 @@
unique_ptr(unique_ptr&& __u)
: _M_t(__u.release(), std::forward<deleter_type>(__u.get_deleter())) { }
- template<typename _Up, typename _Up_Deleter>
+ template<typename _Up, typename _Up_Deleter, typename = typename
+ std::enable_if
+ <std::is_convertible<typename unique_ptr<_Up, _Up_Deleter>::pointer,
+ pointer>::value
+ && !std::is_array<_Up>::value
+ && ((std::is_reference<_Tp_Deleter>::value
+ && std::is_same<_Up_Deleter, _Tp_Deleter>::value)
+ || (!std::is_reference<_Tp_Deleter>::value
+ && std::is_convertible<_Up_Deleter, _Tp_Deleter>::value))>
+ ::type>
unique_ptr(unique_ptr<_Up, _Up_Deleter>&& __u)
: _M_t(__u.release(), std::forward<deleter_type>(__u.get_deleter()))
{ }
+#if _GLIBCXX_DEPRECATED
+ template<typename _Up, typename = typename
+ std::enable_if<std::is_convertible<_Up*, _Tp*>::value
+ && std::is_same<_Tp_Deleter,
+ default_delete<_Tp>>::value>::type>
+ unique_ptr(auto_ptr<_Up>&& __u)
+ : _M_t(__u.release(), deleter_type()) { }
+#endif
+
// Destructor.
~unique_ptr() { reset(); }
-
+
// Assignment.
unique_ptr&
operator=(unique_ptr&& __u)
@@ -150,7 +169,11 @@
return *this;
}
- template<typename _Up, typename _Up_Deleter>
+ template<typename _Up, typename _Up_Deleter, typename = typename
+ std::enable_if
+ <std::is_convertible<typename unique_ptr<_Up, _Up_Deleter>::pointer,
+ pointer>::value
+ && !std::is_array<_Up>::value>::type>
unique_ptr&
operator=(unique_ptr<_Up, _Up_Deleter>&& __u)
{
Index: include/bits/shared_ptr_base.h
===================================================================
--- include/bits/shared_ptr_base.h (revision 163048)
+++ include/bits/shared_ptr_base.h (working copy)
@@ -601,7 +601,8 @@
// generated copy constructor, assignment, destructor are fine.
- template<typename _Tp1>
+ template<typename _Tp1, typename = typename
+ std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type>
__shared_ptr(const __shared_ptr<_Tp1, _Lp>& __r)
: _M_ptr(__r._M_ptr), _M_refcount(__r._M_refcount) // never throws
{ __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>) }
@@ -613,7 +614,8 @@
__r._M_ptr = 0;
}
- template<typename _Tp1>
+ template<typename _Tp1, typename = typename
+ std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type>
__shared_ptr(__shared_ptr<_Tp1, _Lp>&& __r)
: _M_ptr(__r._M_ptr), _M_refcount() // never throws
{
@@ -965,7 +967,8 @@
//
// It is not possible to avoid spurious access violations since
// in multithreaded programs __r._M_ptr may be invalidated at any point.
- template<typename _Tp1>
+ template<typename _Tp1, typename = typename
+ std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type>
__weak_ptr(const __weak_ptr<_Tp1, _Lp>& __r)
: _M_refcount(__r._M_refcount) // never throws
{
@@ -973,7 +976,8 @@
_M_ptr = __r.lock().get();
}
- template<typename _Tp1>
+ template<typename _Tp1, typename = typename
+ std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type>
__weak_ptr(const __shared_ptr<_Tp1, _Lp>& __r)
: _M_ptr(__r._M_ptr), _M_refcount(__r._M_refcount) // never throws
{ __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>) }
Index: testsuite/20_util/unique_ptr/cons/auto_ptr.cc
===================================================================
--- testsuite/20_util/unique_ptr/cons/auto_ptr.cc (revision 0)
+++ testsuite/20_util/unique_ptr/cons/auto_ptr.cc (revision 0)
@@ -0,0 +1,46 @@
+// { dg-options "-std=gnu++0x" }
+
+// Copyright (C) 2010 Free Software Foundation
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// 20.9.10 Class template unique_ptr [unique.ptr]
+
+#include <memory>
+#include <testsuite_hooks.h>
+
+struct A { };
+
+// 20.9.10.2.1 unique_ptr constructors [unique.ptr.single.ctor]
+
+// Construction from auto_ptr
+void
+test01()
+{
+ bool test __attribute__((unused)) = true;
+
+ std::auto_ptr<A> a(new A);
+ std::unique_ptr<A> a2(std::move(a));
+ VERIFY( a.get() == nullptr );
+ VERIFY( a2.get() != 0 );
+}
+
+int
+main()
+{
+ test01();
+ return 0;
+}
Index: testsuite/20_util/unique_ptr/cons/auto_ptr_neg.cc
===================================================================
--- testsuite/20_util/unique_ptr/cons/auto_ptr_neg.cc (revision 0)
+++ testsuite/20_util/unique_ptr/cons/auto_ptr_neg.cc (revision 0)
@@ -0,0 +1,36 @@
+// { dg-options "-std=gnu++0x" }
+// { dg-do compile }
+
+// Copyright (C) 2010 Free Software Foundation
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// 20.9.10 Class template unique_ptr [unique.ptr]
+
+#include <memory>
+
+struct A { };
+
+// 20.9.10.2.1 unique_ptr constructors [unique.ptr.single.ctor]
+
+// Construction from const auto_ptr
+void
+test01()
+{
+ const std::auto_ptr<A> a(new A);
+ std::unique_ptr<A> a2(std::move(a)); // { dg-error "no match" }
+}
+// { dg-excess-errors "candidates are" }
Index: testsuite/20_util/ratio/cons/cons_overflow_neg.cc
===================================================================
--- testsuite/20_util/ratio/cons/cons_overflow_neg.cc (revision 163048)
+++ testsuite/20_util/ratio/cons/cons_overflow_neg.cc (working copy)
@@ -2,7 +2,7 @@
// { dg-options "-std=gnu++0x" }
// { dg-require-cstdint "" }
-// Copyright (C) 2008, 2009 Free Software Foundation
+// Copyright (C) 2008, 2009, 2010 Free Software Foundation
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -24,26 +24,26 @@
void
test01()
{
- std::ratio<INTMAX_MAX, INTMAX_MAX> r1;
- std::ratio<-INTMAX_MAX, INTMAX_MAX> r2;
+ std::ratio<INTMAX_MAX, INTMAX_MAX> r1 __attribute__((unused));
+ std::ratio<-INTMAX_MAX, INTMAX_MAX> r2 __attribute__((unused));
}
void
test02()
{
- std::ratio<INTMAX_MIN, 1> r1;
+ std::ratio<INTMAX_MIN, 1> r1 __attribute__((unused));
}
void
test03()
{
- std::ratio<1, INTMAX_MIN> r1;
+ std::ratio<1, INTMAX_MIN> r1 __attribute__((unused));
}
void
test04()
{
- std::ratio<1,0> r1;
+ std::ratio<1,0> r1 __attribute__((unused));
}
// { dg-error "instantiated from here" "" { target *-*-* } 34 }
Index: testsuite/20_util/shared_ptr/cons/43820.cc
===================================================================
--- testsuite/20_util/shared_ptr/cons/43820.cc (revision 163049)
+++ testsuite/20_util/shared_ptr/cons/43820.cc (working copy)
@@ -35,6 +35,6 @@
// { dg-error "incomplete" "" { target *-*-* } 566 }
std::shared_ptr<X> p9(ap()); // { dg-error "here" }
- // { dg-error "incomplete" "" { target *-*-* } 657 }
+ // { dg-error "incomplete" "" { target *-*-* } 659 }
}
Index: testsuite/20_util/shared_ptr/cons/auto_ptr_neg.cc
===================================================================
--- testsuite/20_util/shared_ptr/cons/auto_ptr_neg.cc (revision 163049)
+++ testsuite/20_util/shared_ptr/cons/auto_ptr_neg.cc (working copy)
@@ -21,28 +21,16 @@
// 20.6.6.2 Template class shared_ptr [util.smartptr.shared]
#include <memory>
-#include <testsuite_hooks.h>
struct A { };
// 20.6.6.2.3 shared_ptr assignment [util.smartptr.shared.const]
// Construction from const auto_ptr
-int
+void
test01()
{
- bool test __attribute__((unused)) = true;
-
const std::auto_ptr<A> a;
std::shared_ptr<A> p(std::move(a)); // { dg-error "no match" }
-
- return 0;
}
-
-int
-main()
-{
- test01();
- return 0;
-}
// { dg-excess-errors "candidates are" }
Index: testsuite/20_util/weak_ptr/comparison/cmp_neg.cc
===================================================================
--- testsuite/20_util/weak_ptr/comparison/cmp_neg.cc (revision 163049)
+++ testsuite/20_util/weak_ptr/comparison/cmp_neg.cc (working copy)
@@ -41,9 +41,9 @@
return 0;
}
-// { dg-warning "note" "" { target *-*-* } 324 }
-// { dg-warning "note" "" { target *-*-* } 423 }
-// { dg-warning "note" "" { target *-*-* } 862 }
+// { dg-warning "note" "" { target *-*-* } 327 }
+// { dg-warning "note" "" { target *-*-* } 446 }
+// { dg-warning "note" "" { target *-*-* } 864 }
// { dg-warning "note" "" { target *-*-* } 580 }
// { dg-warning "note" "" { target *-*-* } 1027 }
// { dg-warning "note" "" { target *-*-* } 340 }
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [v3] Add unique_ptr(auto_ptr<_Up>&&) + contraints
2010-08-10 12:30 [v3] Add unique_ptr(auto_ptr<_Up>&&) + contraints Paolo Carlini
@ 2010-08-10 16:33 ` Jonathan Wakely
2010-08-10 16:36 ` Paolo Carlini
0 siblings, 1 reply; 4+ messages in thread
From: Jonathan Wakely @ 2010-08-10 16:33 UTC (permalink / raw)
To: Paolo Carlini; +Cc: gcc-patches, libstdc++
On 10 August 2010 11:13, Paolo Carlini wrote:
> Hi,
>
> I checked our smart pointers vs US 108 and went add adding the
> unique_ptr constructor from auto_ptr which we were missing. I also added
> some missing constraining to the member functions of those classes.
Excellent. We might as well remove the concept checks such as
__glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
because they'll never fail if SFINAE means the constructor isn't eligible.
I can do that, when I eventually get some spare time again.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [v3] Add unique_ptr(auto_ptr<_Up>&&) + contraints
2010-08-10 16:33 ` Jonathan Wakely
@ 2010-08-10 16:36 ` Paolo Carlini
2010-08-10 17:03 ` Paolo Carlini
0 siblings, 1 reply; 4+ messages in thread
From: Paolo Carlini @ 2010-08-10 16:36 UTC (permalink / raw)
To: Jonathan Wakely; +Cc: gcc-patches, libstdc++
On 08/10/2010 06:31 PM, Jonathan Wakely wrote:
> On 10 August 2010 11:13, Paolo Carlini wrote:
>
>> Hi,
>>
>> I checked our smart pointers vs US 108 and went add adding the
>> unique_ptr constructor from auto_ptr which we were missing. I also added
>> some missing constraining to the member functions of those classes.
>>
> Excellent. We might as well remove the concept checks such as
> __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
> because they'll never fail if SFINAE means the constructor isn't eligible.
>
Oh you are completely right, didn't notice that. I'll do it...
Paolo.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [v3] Add unique_ptr(auto_ptr<_Up>&&) + contraints
2010-08-10 16:36 ` Paolo Carlini
@ 2010-08-10 17:03 ` Paolo Carlini
0 siblings, 0 replies; 4+ messages in thread
From: Paolo Carlini @ 2010-08-10 17:03 UTC (permalink / raw)
To: Jonathan Wakely; +Cc: gcc-patches, libstdc++
[-- Attachment #1: Type: text/plain, Size: 377 bytes --]
On 08/10/2010 06:33 PM, Paolo Carlini wrote:
>> Excellent. We might as well remove the concept checks such as
>> __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
>> because they'll never fail if SFINAE means the constructor isn't eligible.
>>
>>
> Oh you are completely right, didn't notice that. I'll do it...
>
As applied.
Paolo.
/////////////////
[-- Attachment #2: CL --]
[-- Type: text/plain, Size: 311 bytes --]
2010-08-10 Paolo Carlini <paolo.carlini@oracle.com>
* include/bits/shared_ptr_base.h: Remove a few now redundant
__glibcxx_function_requires(_ConvertibleConcept...).
* testsuite/20_util/shared_ptr/cons/43820.cc: Adjust dg-error
line number.
* testsuite/20_util/weak_ptr/comparison/cmp_neg.cc: Likewise.
[-- Attachment #3: patchlet --]
[-- Type: text/plain, Size: 2679 bytes --]
Index: include/bits/shared_ptr_base.h
===================================================================
--- include/bits/shared_ptr_base.h (revision 163053)
+++ include/bits/shared_ptr_base.h (working copy)
@@ -605,7 +605,7 @@
std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type>
__shared_ptr(const __shared_ptr<_Tp1, _Lp>& __r)
: _M_ptr(__r._M_ptr), _M_refcount(__r._M_refcount) // never throws
- { __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>) }
+ { }
__shared_ptr(__shared_ptr&& __r)
: _M_ptr(__r._M_ptr), _M_refcount() // never throws
@@ -619,7 +619,6 @@
__shared_ptr(__shared_ptr<_Tp1, _Lp>&& __r)
: _M_ptr(__r._M_ptr), _M_refcount() // never throws
{
- __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
_M_refcount._M_swap(__r._M_refcount);
__r._M_ptr = 0;
}
@@ -971,16 +970,13 @@
std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type>
__weak_ptr(const __weak_ptr<_Tp1, _Lp>& __r)
: _M_refcount(__r._M_refcount) // never throws
- {
- __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
- _M_ptr = __r.lock().get();
- }
+ { _M_ptr = __r.lock().get(); }
template<typename _Tp1, typename = typename
std::enable_if<std::is_convertible<_Tp1*, _Tp*>::value>::type>
__weak_ptr(const __shared_ptr<_Tp1, _Lp>& __r)
: _M_ptr(__r._M_ptr), _M_refcount(__r._M_refcount) // never throws
- { __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>) }
+ { }
template<typename _Tp1>
__weak_ptr&
Index: testsuite/20_util/shared_ptr/cons/43820.cc
===================================================================
--- testsuite/20_util/shared_ptr/cons/43820.cc (revision 163053)
+++ testsuite/20_util/shared_ptr/cons/43820.cc (working copy)
@@ -35,6 +35,6 @@
// { dg-error "incomplete" "" { target *-*-* } 566 }
std::shared_ptr<X> p9(ap()); // { dg-error "here" }
- // { dg-error "incomplete" "" { target *-*-* } 659 }
+ // { dg-error "incomplete" "" { target *-*-* } 658 }
}
Index: testsuite/20_util/weak_ptr/comparison/cmp_neg.cc
===================================================================
--- testsuite/20_util/weak_ptr/comparison/cmp_neg.cc (revision 163053)
+++ testsuite/20_util/weak_ptr/comparison/cmp_neg.cc (working copy)
@@ -43,7 +43,7 @@
// { dg-warning "note" "" { target *-*-* } 327 }
// { dg-warning "note" "" { target *-*-* } 446 }
-// { dg-warning "note" "" { target *-*-* } 864 }
+// { dg-warning "note" "" { target *-*-* } 863 }
// { dg-warning "note" "" { target *-*-* } 580 }
// { dg-warning "note" "" { target *-*-* } 1027 }
// { dg-warning "note" "" { target *-*-* } 340 }
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2010-08-10 16:55 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-08-10 12:30 [v3] Add unique_ptr(auto_ptr<_Up>&&) + contraints Paolo Carlini
2010-08-10 16:33 ` Jonathan Wakely
2010-08-10 16:36 ` Paolo Carlini
2010-08-10 17:03 ` Paolo Carlini
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).