]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
cons_overflow_neg.cc: Avoid -Wall warnings.
authorPaolo Carlini <paolo.carlini@oracle.com>
Tue, 10 Aug 2010 10:08:56 +0000 (10:08 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Tue, 10 Aug 2010 10:08:56 +0000 (10:08 +0000)
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

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/shared_ptr.h
libstdc++-v3/include/bits/shared_ptr_base.h
libstdc++-v3/include/bits/unique_ptr.h
libstdc++-v3/include/std/memory
libstdc++-v3/testsuite/20_util/ratio/cons/cons_overflow_neg.cc
libstdc++-v3/testsuite/20_util/shared_ptr/cons/43820.cc
libstdc++-v3/testsuite/20_util/shared_ptr/cons/auto_ptr_neg.cc
libstdc++-v3/testsuite/20_util/unique_ptr/cons/auto_ptr.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/unique_ptr/cons/auto_ptr_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/weak_ptr/comparison/cmp_neg.cc

index 60155681d2e24cb4e0f2ba93873ea05b16b6d147..9a3aaca2b37271df1b5a7d4efb5d675c2743cb70 100644 (file)
@@ -1,3 +1,29 @@
+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
index 4f87dd459cfd60ef8c20a681587b068647b28f42..fe79cdd1547d32d81234d5620dea3d064f38a652 100644 (file)
@@ -206,8 +206,10 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
        *  @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 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
        *  @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 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
     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 0a69d2b2411b6ed9c74e209c1510075494f86b5b..b9b0ed94b5446f3bf18a3783e9b665adb573b87c 100644 (file)
@@ -601,7 +601,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
 
       //  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 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
        __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 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
       //
       // 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 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
          _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 ac62ff7f3041a6f1037f63bd62376acec68fb956..cf05ec2a4ea8735d662792a261821f8e143e6b49 100644 (file)
@@ -49,7 +49,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
       {
        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 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
       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 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
         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 3e7d4e8466b9b1ca3db1a51067f18e4f8d55c640..42e948a30d08b296368a427bd5c8b3abd13f4d73 100644 (file)
@@ -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
 #  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 eee2644035c2a9bfee8d883c93bddc17be38978d..252265c8d4157d6673e7e09d4b0001682963184b 100644 (file)
@@ -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
 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 09be153d4c6c2ad971c7c1dd201e991f22636463..81d3a0f22bfe175cd21fd6ad6dca17c17307d490 100644 (file)
@@ -35,6 +35,6 @@ void test01()
   // { 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 e2ef60e3fbb21e03b5cbd77014956b75df45cef8..b078a7df7988843e8458ed2b40f5ab39a8ecc8d6 100644 (file)
 // 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" }
diff --git a/libstdc++-v3/testsuite/20_util/unique_ptr/cons/auto_ptr.cc b/libstdc++-v3/testsuite/20_util/unique_ptr/cons/auto_ptr.cc
new file mode 100644 (file)
index 0000000..f4b9838
--- /dev/null
@@ -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;
+}
diff --git a/libstdc++-v3/testsuite/20_util/unique_ptr/cons/auto_ptr_neg.cc b/libstdc++-v3/testsuite/20_util/unique_ptr/cons/auto_ptr_neg.cc
new file mode 100644 (file)
index 0000000..76910c3
--- /dev/null
@@ -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 7942c0527a3ba002e062abe71fdb89b3573c8466..2635a332ff7a30833e4d50ce1abc11dfbe1c4be4 100644 (file)
@@ -41,9 +41,9 @@ main()
   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 }