Commit 5aadb69b by Paolo Carlini Committed by Paolo Carlini

cons_overflow_neg.cc: Avoid -Wall warnings.

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.

From-SVN: r163053
parent e80c2726
2010-08-10 Paolo Carlini <paolo.carlini@oracle.com> 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.
2010-08-10 Paolo Carlini <paolo.carlini@oracle.com>
PR libstdc++/45228 PR libstdc++/45228
* include/std/tuple (tuple<typename... _Elements>): Constrain * include/std/tuple (tuple<typename... _Elements>): Constrain
converting constructors and assignment operators with converting constructors and assignment operators with
......
...@@ -206,8 +206,10 @@ _GLIBCXX_BEGIN_NAMESPACE(std) ...@@ -206,8 +206,10 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
* @param __r A %shared_ptr. * @param __r A %shared_ptr.
* @post get() == __r.get() && use_count() == __r.use_count() * @post get() == __r.get() && use_count() == __r.use_count()
*/ */
template<typename _Tp1> template<typename _Tp1, typename = typename
shared_ptr(const shared_ptr<_Tp1>& __r) : __shared_ptr<_Tp>(__r) { } 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. * @brief Move-constructs a %shared_ptr instance from @a __r.
...@@ -222,7 +224,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) ...@@ -222,7 +224,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
* @param __r A %shared_ptr rvalue. * @param __r A %shared_ptr rvalue.
* @post *this contains the old value of @a __r, @a __r is empty. * @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(shared_ptr<_Tp1>&& __r)
: __shared_ptr<_Tp>(std::move(__r)) { } : __shared_ptr<_Tp>(std::move(__r)) { }
...@@ -366,11 +369,13 @@ _GLIBCXX_BEGIN_NAMESPACE(std) ...@@ -366,11 +369,13 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
public: public:
weak_ptr() : __weak_ptr<_Tp>() { } 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(const weak_ptr<_Tp1>& __r)
: __weak_ptr<_Tp>(__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(const shared_ptr<_Tp1>& __r)
: __weak_ptr<_Tp>(__r) { } : __weak_ptr<_Tp>(__r) { }
......
...@@ -601,7 +601,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) ...@@ -601,7 +601,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
// generated copy constructor, assignment, destructor are fine. // 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) __shared_ptr(const __shared_ptr<_Tp1, _Lp>& __r)
: _M_ptr(__r._M_ptr), _M_refcount(__r._M_refcount) // never throws : _M_ptr(__r._M_ptr), _M_refcount(__r._M_refcount) // never throws
{ __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>) } { __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>) }
...@@ -613,7 +614,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) ...@@ -613,7 +614,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
__r._M_ptr = 0; __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) __shared_ptr(__shared_ptr<_Tp1, _Lp>&& __r)
: _M_ptr(__r._M_ptr), _M_refcount() // never throws : _M_ptr(__r._M_ptr), _M_refcount() // never throws
{ {
...@@ -965,7 +967,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) ...@@ -965,7 +967,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
// //
// It is not possible to avoid spurious access violations since // It is not possible to avoid spurious access violations since
// in multithreaded programs __r._M_ptr may be invalidated at any point. // 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) __weak_ptr(const __weak_ptr<_Tp1, _Lp>& __r)
: _M_refcount(__r._M_refcount) // never throws : _M_refcount(__r._M_refcount) // never throws
{ {
...@@ -973,7 +976,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) ...@@ -973,7 +976,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
_M_ptr = __r.lock().get(); _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) __weak_ptr(const __shared_ptr<_Tp1, _Lp>& __r)
: _M_ptr(__r._M_ptr), _M_refcount(__r._M_refcount) // never throws : _M_ptr(__r._M_ptr), _M_refcount(__r._M_refcount) // never throws
{ __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>) } { __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>) }
......
...@@ -49,7 +49,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) ...@@ -49,7 +49,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
{ {
default_delete() { } 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>&) { } default_delete(const default_delete<_Up>&) { }
void void
...@@ -133,11 +134,29 @@ _GLIBCXX_BEGIN_NAMESPACE(std) ...@@ -133,11 +134,29 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
unique_ptr(unique_ptr&& __u) unique_ptr(unique_ptr&& __u)
: _M_t(__u.release(), std::forward<deleter_type>(__u.get_deleter())) { } : _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) unique_ptr(unique_ptr<_Up, _Up_Deleter>&& __u)
: _M_t(__u.release(), std::forward<deleter_type>(__u.get_deleter())) : _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. // Destructor.
~unique_ptr() { reset(); } ~unique_ptr() { reset(); }
...@@ -150,7 +169,11 @@ _GLIBCXX_BEGIN_NAMESPACE(std) ...@@ -150,7 +169,11 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
return *this; 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& unique_ptr&
operator=(unique_ptr<_Up, _Up_Deleter>&& __u) operator=(unique_ptr<_Up, _Up_Deleter>&& __u)
{ {
......
// <memory> -*- C++ -*- // <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. // Free Software Foundation, Inc.
// //
// This file is part of the GNU ISO C++ Library. This library is free // This file is part of the GNU ISO C++ Library. This library is free
...@@ -81,10 +82,10 @@ ...@@ -81,10 +82,10 @@
# include <type_traits> # include <type_traits>
# include <functional> # include <functional>
# include <debug/debug.h> # include <debug/debug.h>
# include <bits/unique_ptr.h>
# if _GLIBCXX_DEPRECATED # if _GLIBCXX_DEPRECATED
# include <backward/auto_ptr.h> # include <backward/auto_ptr.h>
# endif # endif
# include <bits/unique_ptr.h>
# if defined(_GLIBCXX_INCLUDE_AS_CXX0X) # if defined(_GLIBCXX_INCLUDE_AS_CXX0X)
# include <tr1_impl/boost_sp_counted_base.h> # include <tr1_impl/boost_sp_counted_base.h>
# else # else
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// { dg-options "-std=gnu++0x" } // { dg-options "-std=gnu++0x" }
// { dg-require-cstdint "" } // { 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 // 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 // software; you can redistribute it and/or modify it under the
...@@ -24,26 +24,26 @@ ...@@ -24,26 +24,26 @@
void void
test01() test01()
{ {
std::ratio<INTMAX_MAX, INTMAX_MAX> r1; std::ratio<INTMAX_MAX, INTMAX_MAX> r1 __attribute__((unused));
std::ratio<-INTMAX_MAX, INTMAX_MAX> r2; std::ratio<-INTMAX_MAX, INTMAX_MAX> r2 __attribute__((unused));
} }
void void
test02() test02()
{ {
std::ratio<INTMAX_MIN, 1> r1; std::ratio<INTMAX_MIN, 1> r1 __attribute__((unused));
} }
void void
test03() test03()
{ {
std::ratio<1, INTMAX_MIN> r1; std::ratio<1, INTMAX_MIN> r1 __attribute__((unused));
} }
void void
test04() test04()
{ {
std::ratio<1,0> r1; std::ratio<1,0> r1 __attribute__((unused));
} }
// { dg-error "instantiated from here" "" { target *-*-* } 34 } // { dg-error "instantiated from here" "" { target *-*-* } 34 }
......
...@@ -35,6 +35,6 @@ void test01() ...@@ -35,6 +35,6 @@ void test01()
// { dg-error "incomplete" "" { target *-*-* } 566 } // { dg-error "incomplete" "" { target *-*-* } 566 }
std::shared_ptr<X> p9(ap()); // { dg-error "here" } std::shared_ptr<X> p9(ap()); // { dg-error "here" }
// { dg-error "incomplete" "" { target *-*-* } 657 } // { dg-error "incomplete" "" { target *-*-* } 659 }
} }
...@@ -21,28 +21,16 @@ ...@@ -21,28 +21,16 @@
// 20.6.6.2 Template class shared_ptr [util.smartptr.shared] // 20.6.6.2 Template class shared_ptr [util.smartptr.shared]
#include <memory> #include <memory>
#include <testsuite_hooks.h>
struct A { }; struct A { };
// 20.6.6.2.3 shared_ptr assignment [util.smartptr.shared.const] // 20.6.6.2.3 shared_ptr assignment [util.smartptr.shared.const]
// Construction from const auto_ptr // Construction from const auto_ptr
int void
test01() test01()
{ {
bool test __attribute__((unused)) = true;
const std::auto_ptr<A> a; const std::auto_ptr<A> a;
std::shared_ptr<A> p(std::move(a)); // { dg-error "no match" } std::shared_ptr<A> p(std::move(a)); // { dg-error "no match" }
return 0;
}
int
main()
{
test01();
return 0;
} }
// { dg-excess-errors "candidates are" } // { dg-excess-errors "candidates are" }
// { 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;
}
// { 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" }
...@@ -41,9 +41,9 @@ main() ...@@ -41,9 +41,9 @@ main()
return 0; return 0;
} }
// { dg-warning "note" "" { target *-*-* } 324 } // { dg-warning "note" "" { target *-*-* } 327 }
// { dg-warning "note" "" { target *-*-* } 423 } // { dg-warning "note" "" { target *-*-* } 446 }
// { dg-warning "note" "" { target *-*-* } 862 } // { dg-warning "note" "" { target *-*-* } 864 }
// { dg-warning "note" "" { target *-*-* } 580 } // { dg-warning "note" "" { target *-*-* } 580 }
// { dg-warning "note" "" { target *-*-* } 1027 } // { dg-warning "note" "" { target *-*-* } 1027 }
// { dg-warning "note" "" { target *-*-* } 340 } // { dg-warning "note" "" { target *-*-* } 340 }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment