[v3 patch] Add std::tr1::shared_ptr

Jonathan Wakely cow@compsoc.man.ac.uk
Mon Feb 21 16:00:00 GMT 2005


This adds <tr1/memory> which covers section 2.2 of TR1 - smart pointers.

The code was taken from Boost with permission of the authors. The
<tr1/memory> header contains code from several Boost headers in one
file, which currently has the copyright statements from all those files.
Someone should check I've done everything I need to in order to add this
code to GCC and that the copyrights are OK.

There are no tests for weak_ptr and incomplete tests for shared_ptr,
I'll add them eventually but don't have enough time to do it right now.

I have modified the relevant Boost tests to use the std::tr1::shared_ptr
instead of boost::shared_ptr and run them successfully, but only on a
single processor machine.  The threaded tests should be run on as many
exotic multiprocessor machines as possible, as one of the major changes
I made to the classes was to use GCC's atomic ops instead of the
Boost.Threads library.  I can't commit those tests but I'll make them
available to those who want them.

For the shared_ptr_timing_test my modified versions did better without
optimisation, but worse when optimisation was enabled.  I plan to
investigate that at some point.  It might be because the Boost.Threads
locks can be inlined whereas GCC's atomic ops will make a function call.
For the MT test my version was faster both with and without optimisation
(as expected, since my version uses atomic ops instead of locking.)

Timings for those tests on my uniprocessor x86_64 GNU/Linux box were:

Test name                  Version      -O0     -O1

shared_ptr_timing_test     Boost        2.47    0.62
shared_ptr_timing_test     GCC          2.02    0.92
shared_ptr_mt_test         Boost        6.500   3.450
shared_ptr_mt_test         GCC          4.780   2.270

As well as the names defined by TR1 this patch adds these non-uglified
names to the std::tr1 namespace:
checked_delete, checked_deleter, weak_count, shared_count,
shared_ptr_traits
This is worse name pollution than the boost versions, which put some of
these names in the boost::detail namespace.  The uglification and/or
namespace use should be made more consistent.

The major changes I made to the Boost code were

* Replacing Boost.Threads locks with GCC's atomic ops.
* Removing workarounds for older compilers such as public functions that
  can be private since member template friends and ADL work with GCC
  (so injected-names of friends functions will be found by ADL)

I expect there will be plenty of changes to come but this should
probably be committed now and improved later. OK for mainline?

2005-02-21  Jonathan Wakely

	* include/tr1/memory: New file.
	* include/Makefile.am, include/Makefile.in: Add new TR1 header.
	* testsuite/tr1/2_general_utilities/memory/
	enable_shared_from_this/not_shared.cc: New test.
	* testsuite/tr1/2_general_utilities/memory/
	enable_shared_from_this/shared.cc: New test.
	* testsuite/tr1/2_general_utilities/memory/
	enable_shared_from_this/still_shared.cc: New test.
	* testsuite/tr1/2_general_utilities/memory/
	shared_ptr/assign/assign.cc: New test.
	* testsuite/tr1/2_general_utilities/memory/
	shared_ptr/assign/auto_ptr.cc: New test.
	* testsuite/tr1/2_general_utilities/memory/
	shared_ptr/assign/auto_ptr_neg.cc: New test.
	* testsuite/tr1/2_general_utilities/memory/
	shared_ptr/assign/auto_ptr_rvalue_neg.cc: New test.
	* testsuite/tr1/2_general_utilities/memory/
	shared_ptr/assign/shared_ptr.cc: New test.
	* testsuite/tr1/2_general_utilities/memory/
	shared_ptr/assign/shared_ptr_neg.cc: New test.
	* testsuite/tr1/2_general_utilities/memory/
	shared_ptr/comparison/cmp.cc: New test.
	* testsuite/tr1/2_general_utilities/memory/
	shared_ptr/cons/auto_ptr.cc: New test.
	* testsuite/tr1/2_general_utilities/memory/
	shared_ptr/cons/auto_ptr_neg.cc: New test.
	* testsuite/tr1/2_general_utilities/memory/
	shared_ptr/cons/copy.cc: New test.
	* testsuite/tr1/2_general_utilities/memory/
	shared_ptr/cons/default.cc: New test.
	* testsuite/tr1/2_general_utilities/memory/
	shared_ptr/cons/pointer.cc: New test.
	* testsuite/tr1/2_general_utilities/memory/
	shared_ptr/cons/weak_ptr.cc: New test.
	* testsuite/tr1/2_general_utilities/memory/
	shared_ptr/cons/weak_ptr_expired.cc: New test.
	* testsuite/tr1/2_general_utilities/memory/
	shared_ptr/dest/dest.cc: New test.
	* testsuite/tr1/2_general_utilities/memory/
	shared_ptr/misc/io.cc: New test.
	* testsuite/tr1/2_general_utilities/memory/
	shared_ptr/misc/swap.cc: New test.
	* testsuite/tr1/2_general_utilities/memory/
	shared_ptr/modifiers/reset.cc: New test.
	* testsuite/tr1/2_general_utilities/memory/
	shared_ptr/modifiers/reset_neg.cc: New test.
	* testsuite/tr1/2_general_utilities/memory/
	shared_ptr/modifiers/swap.cc: New test.
	* testsuite/tr1/2_general_utilities/memory/
	shared_ptr/modifiers/swap_neg.cc: New test.
	* testsuite/tr1/2_general_utilities/memory/
	shared_ptr/observers/bool_conv.cc: New test.
	* testsuite/tr1/2_general_utilities/memory/
	shared_ptr/observers/get.cc: New test.
	* testsuite/tr1/2_general_utilities/memory/
	shared_ptr/observers/unique.cc: New test.
	* testsuite/tr1/2_general_utilities/memory/
	shared_ptr/observers/use_count.cc: New test.

jon


-------------- next part --------------
Index: include/Makefile.am
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/Makefile.am,v
retrieving revision 1.93
diff -u -p -r1.93 Makefile.am
--- include/Makefile.am	18 Feb 2005 07:50:07 -0000	1.93
+++ include/Makefile.am	21 Feb 2005 12:51:27 -0000
@@ -229,6 +229,7 @@ tr1_builddir = ./tr1
 tr1_headers = \
 	${tr1_srcdir}/array \
 	${tr1_srcdir}/functional \
+	${tr1_srcdir}/memory \
 	${tr1_srcdir}/tuple \
 	${tr1_srcdir}/utility \
 	${tr1_srcdir}/type_traits \
Index: include/Makefile.in
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/include/Makefile.in,v
retrieving revision 1.122
diff -u -p -r1.122 Makefile.in
--- include/Makefile.in	18 Feb 2005 07:50:07 -0000	1.122
+++ include/Makefile.in	21 Feb 2005 12:51:28 -0000
@@ -445,6 +445,7 @@ tr1_builddir = ./tr1
 tr1_headers = \
 	${tr1_srcdir}/array \
 	${tr1_srcdir}/functional \
+	${tr1_srcdir}/memory \
 	${tr1_srcdir}/tuple \
 	${tr1_srcdir}/utility \
 	${tr1_srcdir}/type_traits \
Index: include/tr1/memory
===================================================================
RCS file: include/tr1/memory
diff -N include/tr1/memory
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ include/tr1/memory	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,996 @@
+// <tr1/memory> -*- C++ -*-
+
+// Copyright (C) 2005 Free Software Foundation, Inc.
+//
+// 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// As a special exception, you may use this file as part of a free software
+// library without restriction.  Specifically, if other files instantiate
+// templates or use macros or inline functions from this file, or you compile
+// this file and link it with other files to produce an executable, this
+// file does not by itself cause the resulting executable to be covered by
+// the GNU General Public License.  This exception does not however
+// invalidate any other reasons why the executable file might be covered by
+// the GNU General Public License.
+
+//  boost/checked_delete.hpp
+//  Copyright (c) 2002, 2003 Peter Dimov
+//  Copyright (c) 2003 Daniel Frey
+//  Copyright (c) 2003 Howard Hinnant
+
+//  boost/shared_count.hpp
+//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
+
+//  shared_ptr.hpp
+//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
+//  Copyright (c) 2001, 2002, 2003 Peter Dimov
+
+//  weak_ptr.hpp
+//  Copyright (c) 2001, 2002, 2003 Peter Dimov
+
+//  enable_shared_from_this.hpp
+//  Copyright (c) 2002 Peter Dimov
+
+#ifndef _TR1_MEMORY
+#define _TR1_MEMORY 1
+
+#include "../memory"
+#include <functional>       // std::less
+#include <exception>        // std::exception
+#include <new>              // std::bad_alloc
+#include <typeinfo>         // std::type_info in get_deleter
+#include <cstddef>          // std::size_t
+#include <algorithm>        // for std::swap
+#include <iosfwd>           // for std::basic_ostream
+#include <cstdlib>          // for std::abort
+
+#include <bits/gthr.h>
+#include <bits/atomicity.h>
+#include <bits/functexcept.h>
+#include <debug/debug.h>
+
+// namespace std::tr1
+namespace std
+{
+namespace tr1
+{
+
+class bad_weak_ptr : public std::exception
+{
+public:
+
+  virtual char const* what() const throw()
+  {
+    return "tr1::bad_weak_ptr";
+  }
+};
+
+// Helper for exception objects in <tr1/memory>
+// TODO this should be defined in a different file.
+void
+__throw_bad_weak_ptr()
+{
+#if __EXCEPTIONS
+  throw bad_weak_ptr();
+#else
+  std::abort();
+#endif
+}
+
+
+// verify that types are complete for increased safety
+
+template <typename _Tp>
+  inline void
+  checked_delete(_Tp * __x)
+  {
+    // intentionally complex - simplification causes regressions
+    typedef char type_must_be_complete[ sizeof(_Tp)? 1: -1 ];
+    (void) sizeof(type_must_be_complete);
+    delete __x;
+  }
+
+template <typename _Tp>
+  struct checked_deleter
+  {
+    typedef void result_type;
+    typedef _Tp* argument_type;
+
+    void
+    operator()(_Tp * x) const
+    { std::tr1::checked_delete(x); }
+  };
+
+
+class _Sp_counted_base
+{
+public:
+
+  _Sp_counted_base()
+  : _M_use_count(1), _M_weak_count(1)
+  { }
+
+  virtual
+  ~_Sp_counted_base() // nothrow
+  { }
+
+  // dispose() is called when _M_use_count drops to zero, to release
+  // the resources managed by *this.
+  virtual void
+  dispose() = 0; // nothrow
+
+  // destroy() is called when _M_weak_count drops to zero.
+  virtual void
+  destroy() // nothrow
+  {
+    delete this;
+  }
+
+  virtual void*
+  get_deleter(const std::type_info&) = 0;
+
+  void
+  add_ref_copy()
+  {
+    __gnu_cxx::__atomic_add(&_M_use_count, 1);
+  }
+
+  void
+  add_ref_lock()
+  {
+    if (_M_use_count <= 0) // XXX is this MT safe?
+    {
+      __throw_bad_weak_ptr();
+    }
+    __gnu_cxx::__atomic_add(&_M_use_count, 1);
+  }
+
+  void
+  release() // nothrow
+  {
+    if (__gnu_cxx::__exchange_and_add(&_M_use_count, -1) <= 1)
+    {
+      dispose();
+      weak_release();
+    }
+  }
+
+  void
+  weak_add_ref() // nothrow
+  {
+    __gnu_cxx::__atomic_add(&_M_weak_count, 1);
+  }
+
+  void
+  weak_release() // nothrow
+  {
+    if (__gnu_cxx::__exchange_and_add(&_M_weak_count, -1) <= 1)
+    {
+      destroy();
+    }
+  }
+
+  long
+  use_count() const // nothrow
+  {
+    return _M_use_count;  // XXX is this MT safe?
+  }
+
+private:
+
+  _Sp_counted_base(_Sp_counted_base const&);
+  _Sp_counted_base& operator= (_Sp_counted_base const&);
+
+  _Atomic_word _M_use_count;        // #shared
+  _Atomic_word _M_weak_count;       // #weak + (#shared != 0)
+};
+
+template <typename _Ptr, typename _Deleter>
+class _Sp_counted_base_impl : public _Sp_counted_base
+{
+public:
+
+  /**
+   *  @brief   
+   *  @pre     d(p) must not throw.
+   */
+  _Sp_counted_base_impl(_Ptr __p, _Deleter __d)
+  : _M_ptr(__p), _M_del(__d)
+  { }
+
+  virtual void
+  dispose() // nothrow
+  {
+    _M_del(_M_ptr);
+  }
+
+  virtual void*
+  get_deleter(const std::type_info& __ti)
+  {
+    return __ti == typeid(_Deleter) ? &_M_del : 0;
+  }
+
+private:
+  _Sp_counted_base_impl(const _Sp_counted_base_impl&);
+  _Sp_counted_base_impl& operator=(const _Sp_counted_base_impl&);
+
+  _Ptr     _M_ptr; // copy constructor must not throw
+  _Deleter _M_del; // copy constructor must not throw
+};
+
+class weak_count;
+
+class shared_count
+{
+private:
+
+  _Sp_counted_base* _M_pi;
+
+  friend class weak_count;
+
+public:
+
+  shared_count()
+  : _M_pi(0) // nothrow
+  { }
+
+  template <typename _Ptr, typename _Deleter>
+    shared_count(_Ptr __p, _Deleter __d)
+    : _M_pi(0)
+    {
+      try
+      {
+        _M_pi = new _Sp_counted_base_impl<_Ptr, _Deleter>(__p, __d);
+      }
+      catch(...)
+      {
+        __d(__p); // delete __p
+        __throw_exception_again;
+      }
+    }
+
+  // auto_ptr<_Tp> is special cased to provide the strong guarantee
+
+  template <typename _Tp>
+    explicit shared_count(std::auto_ptr<_Tp>& __r)
+    : _M_pi(new _Sp_counted_base_impl<_Tp*,checked_deleter<_Tp> >(
+            __r.get(), checked_deleter<_Tp>()
+            ))
+    { __r.release(); }
+
+  // throws bad_weak_ptr when __r.use_count() == 0
+  explicit shared_count(const weak_count& __r);
+
+  ~shared_count() // nothrow
+  {
+    if (_M_pi != 0)
+      _M_pi->release();
+  }
+
+  shared_count(const shared_count& __r)
+  : _M_pi(__r._M_pi) // nothrow
+  {
+    if (_M_pi != 0)
+      _M_pi->add_ref_copy();
+  }
+
+  shared_count&
+  operator=(const shared_count& __r) // nothrow
+  {
+    _Sp_counted_base* __tmp = __r._M_pi;
+
+    if(__tmp != _M_pi)
+    {
+      if(__tmp != 0)
+        __tmp->add_ref_copy();
+      if(_M_pi != 0)
+        _M_pi->release();
+      _M_pi = __tmp;
+    }
+    return *this;
+  }
+
+  void swap(shared_count& __r) // nothrow
+  {
+    _Sp_counted_base* __tmp = __r._M_pi;
+    __r._M_pi = _M_pi;
+    _M_pi = __tmp;
+  }
+
+  long
+  use_count() const // nothrow
+  { return _M_pi != 0 ? _M_pi->use_count() : 0; }
+
+  bool
+  unique() const // nothrow
+  { return this->use_count() == 1; }
+
+  friend inline bool
+  operator==(const shared_count& __a, const shared_count& __b)
+  { return __a._M_pi == __b._M_pi; }
+
+  friend inline bool
+  operator<(const shared_count& __a, const shared_count& __b)
+  { return std::less<_Sp_counted_base*>()(__a._M_pi, __b._M_pi); }
+
+  void*
+  get_deleter(const std::type_info& __ti) const
+  { return _M_pi ? _M_pi->get_deleter(__ti) : 0; }
+};
+
+
+class weak_count
+{
+private:
+
+  _Sp_counted_base * _M_pi;
+
+  friend class shared_count;
+
+public:
+
+  weak_count()
+  : _M_pi(0) // nothrow
+  { }
+
+  weak_count(const shared_count& __r)
+  : _M_pi(__r._M_pi) // nothrow
+  {
+    if (_M_pi != 0)
+      _M_pi->weak_add_ref();
+  }
+
+  weak_count(const weak_count& __r)
+  : _M_pi(__r._M_pi) // nothrow
+  {
+    if (_M_pi != 0)
+      _M_pi->weak_add_ref();
+  }
+
+  ~weak_count() // nothrow
+  {
+    if (_M_pi != 0)
+      _M_pi->weak_release();
+  }
+
+  weak_count&
+  operator=(const shared_count& __r) // nothrow
+  {
+    _Sp_counted_base* __tmp = __r._M_pi;
+    if (__tmp != 0)
+      __tmp->weak_add_ref();
+    if (_M_pi != 0)
+      _M_pi->weak_release();
+    _M_pi = __tmp;
+
+    return *this;
+  }
+
+  weak_count&
+  operator=(const weak_count& __r) // nothrow
+  {
+    _Sp_counted_base * __tmp = __r._M_pi;
+    if (__tmp != 0)
+      __tmp->weak_add_ref();
+    if (_M_pi != 0)
+      _M_pi->weak_release();
+    _M_pi = __tmp;
+
+    return *this;
+  }
+
+  void
+  swap(weak_count& __r) // nothrow
+  {
+    _Sp_counted_base * __tmp = __r._M_pi;
+    __r._M_pi = _M_pi;
+    _M_pi = __tmp;
+  }
+
+  long
+  use_count() const // nothrow
+  { return _M_pi != 0 ? _M_pi->use_count() : 0; }
+
+  friend inline bool
+  operator==(const weak_count& __a, const weak_count& __b)
+  { return __a._M_pi == __b._M_pi; }
+
+  friend inline bool
+  operator<(const weak_count& __a, const weak_count& __b)
+  { return std::less<_Sp_counted_base*>()(__a._M_pi, __b._M_pi); }
+};
+
+inline
+shared_count::shared_count(const weak_count& __r)
+: _M_pi(__r._M_pi)
+{
+  if (_M_pi != 0)
+  {
+    _M_pi->add_ref_lock();
+  }
+  else
+  {
+    __throw_bad_weak_ptr();
+  }
+}
+
+// fwd decls
+template <typename _Tp> class weak_ptr;
+template <typename _Tp> class enable_shared_from_this;
+
+struct __static_cast_tag {};
+struct __const_cast_tag {};
+struct __dynamic_cast_tag {};
+struct __polymorphic_cast_tag {};
+
+template<class _Tp> struct shared_ptr_traits
+{
+    typedef _Tp & reference;
+};
+
+template<> struct shared_ptr_traits<void>
+{
+    typedef void reference;
+};
+
+template<> struct shared_ptr_traits<void const>
+{
+    typedef void reference;
+};
+
+template<> struct shared_ptr_traits<void volatile>
+{
+    typedef void reference;
+};
+
+template<> struct shared_ptr_traits<void const volatile>
+{
+    typedef void reference;
+};
+
+
+// enable_shared_from_this support
+
+// friend of enable_shared_from_this
+template <typename _Tp1, typename _Tp2>
+  void
+  __enable_shared_from_this( const shared_count& __pn,
+                             const enable_shared_from_this<_Tp1>* __pe,
+                             const _Tp2* __px );
+
+inline void
+__enable_shared_from_this(const shared_count&, ...)
+{ }
+
+/**
+ *  @class shared_ptr <tr1/memory>
+ *
+ *  A smart pointer with reference-counted copy semantics.
+ *  The object pointed to is deleted when the last shared_ptr pointing to it
+ *  is destroyed or reset.
+ */
+
+template <typename _Tp>
+  class shared_ptr
+  {
+    typedef typename shared_ptr_traits<_Tp>::reference _Reference;
+
+  public:
+
+    typedef _Tp   element_type;
+
+    /** @brief  Construct an empty %shared_ptr.
+     *  @post   use_count()==0 && get()==0
+     */
+    shared_ptr() : _M_ptr(0), _M_refcount() // never throws
+    { }
+
+    /** @brief  Construct a %shared_ptr that owns the pointer @a p.
+     *  @param  p  A pointer that is convertible to element_type*.
+     *  @post   use_count()==1 && get()==p
+     *  @throw  std::bad_alloc, in which case @c delete @a p is called.
+     */
+    template <typename _Tp1>
+      explicit shared_ptr(_Tp1* __p)
+      : _M_ptr(__p), _M_refcount(__p, checked_deleter<_Tp1>())
+      {
+        __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
+        // __glibcxx_function_requires(_CompleteConcept<_Tp1*>)
+
+        __enable_shared_from_this( _M_refcount, __p, __p );
+      }
+
+    //
+    // Requirements: D's copy constructor and destructor must not throw
+    //
+    // shared_ptr will release p by calling d(p)
+    //
+    /** @brief  Construct a %shared_ptr that owns the pointer @a p
+     *          and the deleter @a d.
+     *  @param  p  A pointer.
+     *  @param  d  A deleter.
+     *  @post   use_count()==1 && get()==p
+     *  @throw  std::bad_alloc, in which case @a d(p) is called.
+     */
+    template <typename _Tp1, typename _Deleter>
+      shared_ptr(_Tp1* __p, _Deleter __d)
+      : _M_ptr(__p), _M_refcount(__p, __d)
+      {
+        __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
+        // TODO requires D is CopyConstructible and d(p) well-formed
+
+        __enable_shared_from_this( _M_refcount, __p, __p );
+      }
+
+    //  generated copy constructor, assignment, destructor are fine.
+
+    /** @brief  If @a r is empty, constructs an empty %shared_ptr; otherwise
+     *          construct a %shared_ptr that shares ownership with @a r.
+     *  @param  r  A %shared_ptr.
+     *  @post   get()==r.get() && use_count()==r.use_count()
+     *  @throw  std::bad_alloc, in which case 
+     */
+    template <typename _Tp1>
+      shared_ptr(const shared_ptr<_Tp1>& __r)
+      : _M_ptr(__r._M_ptr), _M_refcount(__r._M_refcount) // never throws
+      {
+        __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
+      }
+
+    /** @brief  Constructs a %shared_ptr that shares ownership with @a r
+     *          and stores a copy of the pointer stored in @a r.
+     *  @param  r  A weak_ptr.
+     *  @post   use_count()==r.use_count()
+     *  @throw  bad_weak_ptr when r.expired(),
+     *          in which case the constructor has no effect.
+     */
+    template <typename _Tp1>
+      explicit shared_ptr(const weak_ptr<_Tp1>& __r)
+      : _M_refcount(__r._M_refcount) // may throw
+      {
+        __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
+        // it is now safe to copy r__._M_ptr, as _M_refcount(__r._M_refcount)
+        // did not throw
+        _M_ptr = __r._M_ptr;
+      }
+
+    /**
+     * @post use_count()==1 and r.get()==0
+     */
+    template <typename _Tp1>
+      explicit shared_ptr(std::auto_ptr<_Tp1>& __r)
+      : _M_ptr(__r.get()), _M_refcount()
+      {
+        // TODO requires r.release() convertible to _Tp*, Tp1 is complete,
+        // delete r.release() well-formed
+        _Tp1 * __tmp = __r.get();
+        _M_refcount = shared_count(__r);
+
+        __enable_shared_from_this( _M_refcount, __tmp, __tmp );
+      }
+
+    template <typename _Tp1>
+      shared_ptr(const shared_ptr<_Tp1>& __r, __static_cast_tag)
+      : _M_ptr(static_cast<element_type*>(__r._M_ptr))
+      , _M_refcount(__r._M_refcount)
+      { }
+
+    template <typename _Tp1>
+      shared_ptr(const shared_ptr<_Tp1>& __r, __const_cast_tag)
+      : _M_ptr(const_cast<element_type*>(__r._M_ptr))
+      , _M_refcount(__r._M_refcount)
+      { }
+
+    template <typename _Tp1>
+      shared_ptr(const shared_ptr<_Tp1>& __r, __dynamic_cast_tag)
+      : _M_ptr(dynamic_cast<element_type*>(__r._M_ptr))
+      , _M_refcount(__r._M_refcount)
+      {
+        if (_M_ptr == 0) // need to allocate new counter -- the cast failed
+        {
+          _M_refcount = shared_count();
+        }
+      }
+
+    template <typename _Tp1>
+      shared_ptr&
+      operator=(const shared_ptr<_Tp1>& __r) // never throws
+      {
+        _M_ptr = __r._M_ptr;
+        _M_refcount = __r._M_refcount; // shared_count::op= doesn't throw
+        return *this;
+      }
+
+    template <typename _Tp1>
+      shared_ptr&
+      operator=(std::auto_ptr<_Tp1>& __r)
+      {
+        shared_ptr(__r).swap(*this);
+        return *this;
+      }
+
+    void
+    reset() // never throws
+    { shared_ptr().swap(*this); }
+
+    template <typename _Tp1>
+      void
+      reset(_Tp1* __p) // _Tp1 must be complete
+      {
+        _GLIBCXX_DEBUG_ASSERT(__p == 0 || __p != _M_ptr); // catch self-reset errors
+        shared_ptr(__p).swap(*this);
+      }
+
+    template <typename _Tp1, typename _Deleter>
+      void
+      reset(_Tp1 * __p, _Deleter __d)
+      { shared_ptr(__p, __d).swap(*this); }
+
+    // error to instantiate if _Tp is [cv-qual] void
+    _Reference
+    operator*() const // never throws
+    {
+      _GLIBCXX_DEBUG_ASSERT(_M_ptr != 0);
+      return *_M_ptr;
+    }
+
+    _Tp*
+    operator->() const // never throws
+    {
+      _GLIBCXX_DEBUG_ASSERT(_M_ptr != 0);
+      return _M_ptr;
+    }
+    
+    _Tp*
+    get() const // never throws
+    { return _M_ptr; }
+
+    // implicit conversion to "bool"
+  private:
+    typedef _Tp* shared_ptr::*__unspecified_bool_type;
+
+  public:
+    operator __unspecified_bool_type() const // never throws
+    { return _M_ptr == 0 ? 0 : &shared_ptr::_M_ptr; }
+
+    bool
+    unique() const // never throws
+    { return _M_refcount.unique(); }
+
+    long
+    use_count() const // never throws
+    { return _M_refcount.use_count(); }
+
+    void
+    swap(shared_ptr<_Tp>& __other) // never throws
+    {
+      std::swap(_M_ptr, __other._M_ptr);
+      _M_refcount.swap(__other._M_refcount);
+    }
+
+  private:
+    template <typename _Tp1>
+      bool
+      _M_less(const shared_ptr<_Tp1>& __rhs) const
+      { return _M_refcount < __rhs._M_refcount; }
+
+    void*
+    _M_get_deleter(const std::type_info& __ti) const
+    { return _M_refcount.get_deleter(__ti); }
+
+    template <typename _Tp1> friend class shared_ptr;
+    template <typename _Tp1> friend class weak_ptr;
+
+    // friends injected into enclosing namespace and found by ADL:
+
+    // get_deleter (experimental)
+    template <typename _Del>
+      friend inline _Del*
+      get_deleter(const shared_ptr& __p)
+      { return static_cast<_Del*>(__p._M_get_deleter(typeid(_Del))); }
+
+    template <typename _Tp1>
+      friend inline bool
+      operator==(const shared_ptr& __a, const shared_ptr<_Tp1>& __b)
+      { return __a.get() == __b.get(); }
+
+    template <typename _Tp1>
+      friend inline bool
+      operator!=(const shared_ptr& __a, const shared_ptr<_Tp1>& __b)
+      { return __a.get() != __b.get(); }
+
+    template <typename _Tp1>
+      friend inline bool
+      operator<(const shared_ptr& __a, const shared_ptr<_Tp1>& __b)
+      { return __a._M_less(__b); }
+
+    _Tp*         _M_ptr;         // contained pointer
+    shared_count _M_refcount;    // reference counter
+  };  // shared_ptr
+
+// 2.2.3.9 shared_ptr casts
+
+/** @warning The seemingly equivalent
+ *           <code>shared_ptr<T>(static_cast<T*>(r.get()))</code>
+ *           will eventually result in undefined behaviour,
+ *           attempting to delete the same object twice.
+ */
+template <typename _Tp, typename _Tp1>
+  shared_ptr<_Tp>
+  static_pointer_cast(const shared_ptr<_Tp1>& __r)
+  {
+    return shared_ptr<_Tp>(__r, __static_cast_tag());
+  }
+
+/** @warning The seemingly equivalent
+ *           <code>shared_ptr<T>(const_cast<T*>(r.get()))</code>
+ *           will eventually result in undefined behaviour,
+ *           attempting to delete the same object twice.
+ */
+template <typename _Tp, typename _Tp1>
+  shared_ptr<_Tp>
+  const_pointer_cast(const shared_ptr<_Tp1>& __r)
+  {
+    return shared_ptr<_Tp>(__r, __const_cast_tag());
+  }
+
+/** @warning The seemingly equivalent
+ *           <code>shared_ptr<T>(dynamic_cast<T*>(r.get()))</code>
+ *           will eventually result in undefined behaviour,
+ *           attempting to delete the same object twice.
+ */
+template <typename _Tp, typename _Tp1>
+  shared_ptr<_Tp>
+  dynamic_pointer_cast(const shared_ptr<_Tp1>& __r)
+  {
+    return shared_ptr<_Tp>(__r, __dynamic_cast_tag());
+  }
+
+// operator<<
+template <typename _Ch, typename _Tr, typename _Tp>
+  std::basic_ostream<_Ch,_Tr>&
+  operator<<(std::basic_ostream<_Ch,_Tr>& __os, const shared_ptr<_Tp>& __p)
+  {
+    __os << __p.get();
+    return __os;
+  }
+
+
+template <typename _Tp>
+  class weak_ptr
+  {
+  public:
+
+    typedef _Tp element_type;
+
+    weak_ptr()
+    : _M_ptr(0), _M_refcount() // never throws
+    { }
+
+  //  generated copy constructor, assignment, destructor are fine
+
+  //
+  //  The "obvious" converting constructor implementation:
+  //
+  //  template<class Y>
+  //  weak_ptr(weak_ptr<Y> const & r): _M_ptr(r._M_ptr), _M_refcount(r._M_refcount) // never throws
+  //  {
+  //  }
+  //
+  //  has a serious problem.
+  //
+  //  r._M_ptr may already have been invalidated. The _M_ptr(r._M_ptr)
+  //  conversion may require access to *r._M_ptr (virtual inheritance).
+  //
+  //  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>
+      weak_ptr(const weak_ptr<_Tp1>& r)
+      : _M_refcount(r._M_refcount) // never throws
+      {
+        __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
+        _M_ptr = r.lock().get();
+      }
+
+    template <typename _Tp1>
+      weak_ptr(const shared_ptr<_Tp1>& r)
+      : _M_ptr(r._M_ptr), _M_refcount(r._M_refcount) // never throws
+      {
+        __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
+      }
+
+    template <typename _Tp1>
+      weak_ptr&
+      operator=(const weak_ptr<_Tp1>& r) // never throws
+      {
+        _M_ptr = r.lock().get();
+        _M_refcount = r._M_refcount;
+        return *this;
+      }
+
+    template <typename _Tp1>
+      weak_ptr&
+      operator=(const shared_ptr<_Tp1>& r) // never throws
+      {
+        _M_ptr = r._M_ptr;
+        _M_refcount = r._M_refcount;
+        return *this;
+      }
+
+    shared_ptr<_Tp>
+    lock() const // never throws
+    {
+#ifdef __GTHREADS
+
+      // optimization: avoid throw overhead
+      if (expired())
+      {
+        return shared_ptr<element_type>();
+      }
+
+      try
+      {
+        return shared_ptr<element_type>(*this);
+      }
+      catch (const bad_weak_ptr&)
+      {
+        // Q: how can we get here?
+        // A: another thread may have invalidated r after the use_count test above.
+        return shared_ptr<element_type>();
+      }
+
+#else
+
+      // optimization: avoid try/catch overhead when single threaded
+      return expired() ? shared_ptr<element_type>() : shared_ptr<element_type>(*this);
+
+#endif
+    } // XXX MT
+
+
+    long
+    use_count() const // never throws
+    { return _M_refcount.use_count(); }
+
+    bool
+    expired() const // never throws
+    { return _M_refcount.use_count() == 0; }
+
+    void
+    reset() // never throws
+    { weak_ptr().swap(*this); }
+
+    void
+    swap(weak_ptr& __s) // never throws
+    {
+      std::swap(_M_ptr, __s._M_ptr);
+      _M_refcount.swap(__s._M_refcount);
+    }
+
+  private:
+
+    template <typename _Tp1>
+      bool
+      _M_less(const weak_ptr<_Tp1>& __rhs) const
+      { return _M_refcount < __rhs._M_refcount; }
+
+    // used by __enable_shared_from_this
+    void
+    _M_assign(_Tp* __ptr, const shared_count& __refcount)
+    {
+      _M_ptr = __ptr;
+      _M_refcount = __refcount;
+    }
+
+    // friend injected into namespace and found by ADL
+
+    template <typename _Tp1>
+      friend inline bool
+      operator<(const weak_ptr& __lhs, const weak_ptr<_Tp1>& __rhs)
+      { return __lhs._M_less(__rhs); }
+
+    template <typename _Tp1> friend class weak_ptr;
+    template <typename _Tp1> friend class shared_ptr;
+    friend class enable_shared_from_this<_Tp>;
+
+    _Tp*       _M_ptr;           // contained pointer
+    weak_count _M_refcount;      // reference counter
+
+  };  // weak_ptr
+
+
+
+template <typename _Tp>
+  class enable_shared_from_this
+  {
+  protected:
+
+    enable_shared_from_this()
+    { }
+
+    enable_shared_from_this(const enable_shared_from_this&)
+    { }
+
+    enable_shared_from_this&
+    operator=(const enable_shared_from_this&)
+    { return *this; }
+
+    ~enable_shared_from_this()
+    { }
+
+  public:
+
+    shared_ptr<_Tp>
+    shared_from_this()
+    {
+      shared_ptr<_Tp> p(this->_M_weak_this);
+      return p;
+    }
+
+    shared_ptr<const _Tp>
+    shared_from_this() const
+    {
+      shared_ptr<const _Tp> p(this->_M_weak_this);
+      return p;
+    }
+
+  private:
+    template <typename _Tp1>
+      void
+      _M_weak_assign(_Tp1* __p, const shared_count& __n) const
+      { _M_weak_this._M_assign(__p, __n); }
+
+    template <typename _Tp1>
+      friend void
+      __enable_shared_from_this( const shared_count& __pn, const enable_shared_from_this* __pe, const _Tp1* __px)
+      {
+        if(__pe != 0)
+          __pe->_M_weak_assign(const_cast<_Tp1*>(__px), __pn);
+      }
+
+    mutable weak_ptr<_Tp> _M_weak_this;
+  };
+
+} // namespace tr1
+
+/**
+ *  @brief   std::swap() specialisation for shared_ptr.
+ *  @relates shared_ptr.
+ */
+template <typename _Tp>
+  inline void
+  swap(tr1::shared_ptr<_Tp>& __a, tr1::shared_ptr<_Tp>& __b)
+  {
+    __a.swap(__b);
+  }
+
+/**
+ *  @brief   std::swap() specialisation for weak_ptr.
+ *  @relates weak_ptr.
+ */
+template <typename _Tp>
+  void
+  swap(tr1::weak_ptr<_Tp>& __a, tr1::weak_ptr<_Tp>& __b)
+  {
+    __a.swap(__b);
+  }
+
+} // namespace std
+
+#endif
Index: testsuite/tr1/2_general_utilities/memory/enable_shared_from_this/not_shared.cc
===================================================================
RCS file: testsuite/tr1/2_general_utilities/memory/enable_shared_from_this/not_shared.cc
diff -N testsuite/tr1/2_general_utilities/memory/enable_shared_from_this/not_shared.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/tr1/2_general_utilities/memory/enable_shared_from_this/not_shared.cc	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,110 @@
+// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// 2.2.5 Template class enable_shared_from_this [tr.util.smartptr.enab]
+
+#include <tr1/memory>
+#include <testsuite_hooks.h>
+
+struct X : public std::tr1::enable_shared_from_this<X>
+{
+};
+
+int
+test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  X x;
+
+  try
+  {
+#if __EXCEPTIONS
+    test = false;
+    std::tr1::shared_ptr<X> p = x.shared_from_this();
+#endif
+  }
+  catch (const std::tr1::bad_weak_ptr&)
+  {
+    test = true;
+  }
+  VERIFY( test );
+
+  return 0;
+}
+
+int
+test02()
+{
+  bool test __attribute__((unused)) = true;
+
+  std::tr1::shared_ptr<X> p(new X);
+
+  X x(*p);  // copy of shared object should not be shared
+
+  try
+  {
+#if __EXCEPTIONS
+    test = false;
+    std::tr1::shared_ptr<X> p = x.shared_from_this();
+#endif
+  }
+  catch (const std::tr1::bad_weak_ptr&)
+  {
+    test = true;
+  }
+  VERIFY( test );
+
+  return 0;
+}
+
+int
+test03()
+{
+  bool test __attribute__((unused)) = true;
+
+  std::tr1::shared_ptr<X> p(new X);
+
+  X x;
+  x = *p;  // copy of shared object should not be shared
+
+  try
+  {
+#if __EXCEPTIONS
+    test = false;
+    std::tr1::shared_ptr<X> p = x.shared_from_this();
+#endif
+  }
+  catch (const std::tr1::bad_weak_ptr&)
+  {
+    test = true;
+  }
+  VERIFY( test );
+
+  return 0;
+}
+
+
+int 
+main()
+{
+  test01();
+  test02();
+  test03();
+  return 0;
+}
Index: testsuite/tr1/2_general_utilities/memory/enable_shared_from_this/shared.cc
===================================================================
RCS file: testsuite/tr1/2_general_utilities/memory/enable_shared_from_this/shared.cc
diff -N testsuite/tr1/2_general_utilities/memory/enable_shared_from_this/shared.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/tr1/2_general_utilities/memory/enable_shared_from_this/shared.cc	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,46 @@
+// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// 2.2.5 Template class enable_shared_from_this [tr.util.smartptr.enab]
+
+#include <tr1/memory>
+#include <testsuite_hooks.h>
+
+struct X : public std::tr1::enable_shared_from_this<X>
+{
+};
+
+int
+test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  std::tr1::shared_ptr<X> p(new X);
+  std::tr1::shared_ptr<X>  q = p->shared_from_this();
+  VERIFY( p == q );
+  VERIFY( !(p < q) && !(q < p) );  // p and q share ownership
+
+  return 0;
+}
+
+int 
+main()
+{
+  test01();
+  return 0;
+}
Index: testsuite/tr1/2_general_utilities/memory/enable_shared_from_this/still_shared.cc
===================================================================
RCS file: testsuite/tr1/2_general_utilities/memory/enable_shared_from_this/still_shared.cc
diff -N testsuite/tr1/2_general_utilities/memory/enable_shared_from_this/still_shared.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/tr1/2_general_utilities/memory/enable_shared_from_this/still_shared.cc	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,55 @@
+// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// 2.2.5 Template class enable_shared_from_this [tr.util.smartptr.enab]
+
+#include <tr1/memory>
+#include <testsuite_hooks.h>
+
+struct X : public std::tr1::enable_shared_from_this<X>
+{
+};
+
+int
+test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  std::tr1::shared_ptr<X> p(new X);
+
+  *p = X();  // assigning to shared object doesn't stop it being shared
+
+  try
+  {
+    std::tr1::shared_ptr<X> p2 = p->shared_from_this();
+  }
+  catch (const std::tr1::bad_weak_ptr&)
+  {
+    test = false;
+  }
+  VERIFY( test );
+
+  return 0;
+}
+
+int 
+main()
+{
+  test01();
+  return 0;
+}
Index: testsuite/tr1/2_general_utilities/memory/shared_ptr/assign/assign.cc
===================================================================
RCS file: testsuite/tr1/2_general_utilities/memory/shared_ptr/assign/assign.cc
diff -N testsuite/tr1/2_general_utilities/memory/shared_ptr/assign/assign.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/tr1/2_general_utilities/memory/shared_ptr/assign/assign.cc	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,71 @@
+// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// TR1 2.2.2 Template class shared_ptr [tr.util.smartptr.shared]
+
+#include <tr1/memory>
+#include <testsuite_hooks.h>
+
+struct A
+{
+  A() { ++ctor_count; }
+  virtual ~A() { ++dtor_count; }
+  static long ctor_count;
+  static long dtor_count;
+};
+long A::ctor_count = 0;
+long A::dtor_count = 0;
+
+struct reset_count_struct
+{
+  ~reset_count_struct()
+  {
+    A::ctor_count = 0;
+    A::dtor_count = 0;
+  }
+};
+
+
+// 2.2.3.3 shared_ptr assignment [tr.util.smartptr.shared.assign]
+
+// Assignment from shared_ptr<Y>
+int
+test01()
+{
+  reset_count_struct __attribute__((unused)) reset;
+  bool test __attribute__((unused)) = true;
+
+  std::tr1::shared_ptr<A> a;
+
+  a = std::tr1::shared_ptr<A>(new A);
+  VERIFY( a.get() != 0 );
+  VERIFY( A::ctor_count == 1 );
+  VERIFY( A::dtor_count == 0 );
+
+  a = std::tr1::shared_ptr<A>();
+  VERIFY( a.get() == 0 );
+  VERIFY( A::ctor_count == 1 );
+  VERIFY( A::dtor_count == 1 );
+}
+
+int 
+main()
+{
+  test01();
+  return 0;
+}
Index: testsuite/tr1/2_general_utilities/memory/shared_ptr/assign/auto_ptr.cc
===================================================================
RCS file: testsuite/tr1/2_general_utilities/memory/shared_ptr/assign/auto_ptr.cc
diff -N testsuite/tr1/2_general_utilities/memory/shared_ptr/assign/auto_ptr.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/tr1/2_general_utilities/memory/shared_ptr/assign/auto_ptr.cc	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,84 @@
+// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// TR1 2.2.2 Template class shared_ptr [tr.util.smartptr.shared]
+
+#include <tr1/memory>
+#include <testsuite_hooks.h>
+
+struct A
+{
+  A() { ++ctor_count; }
+  virtual ~A() { ++dtor_count; }
+  static long ctor_count;
+  static long dtor_count;
+};
+long A::ctor_count = 0;
+long A::dtor_count = 0;
+
+struct B : A
+{
+  B() { ++ctor_count; }
+  virtual ~B() { ++dtor_count; }
+  static long ctor_count;
+  static long dtor_count;
+};
+long B::ctor_count = 0;
+long B::dtor_count = 0;
+
+
+struct reset_count_struct
+{
+  ~reset_count_struct()
+  {
+    A::ctor_count = 0;
+    A::dtor_count = 0;
+    B::ctor_count = 0;
+    B::dtor_count = 0;
+  }
+};
+
+
+// 2.2.3.3 shared_ptr assignment [tr.util.smartptr.shared.assign]
+
+// Assignment from auto_ptr<Y>
+int
+test01()
+{
+  reset_count_struct __attribute__((unused)) reset;
+  bool test __attribute__((unused)) = true;
+
+  std::tr1::shared_ptr<A> a(new A);
+  std::auto_ptr<B> b(new B);
+  a = b;
+  VERIFY( a.get() != 0 );
+  VERIFY( b.get() == 0 );
+  VERIFY( A::ctor_count == 2 );
+  VERIFY( A::dtor_count == 1 );
+  VERIFY( B::ctor_count == 1 );
+  VERIFY( B::dtor_count == 0 );
+
+  return 0;
+}
+
+int 
+main()
+{
+  test01();
+  return 0;
+}
Index: testsuite/tr1/2_general_utilities/memory/shared_ptr/assign/auto_ptr_neg.cc
===================================================================
RCS file: testsuite/tr1/2_general_utilities/memory/shared_ptr/assign/auto_ptr_neg.cc
diff -N testsuite/tr1/2_general_utilities/memory/shared_ptr/assign/auto_ptr_neg.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/tr1/2_general_utilities/memory/shared_ptr/assign/auto_ptr_neg.cc	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,50 @@
+// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// TR1 2.2.2 Template class shared_ptr [tr.util.smartptr.shared]
+
+#include <tr1/memory>
+#include <testsuite_hooks.h>
+
+struct A { };
+struct B { };
+
+// 2.2.3.3 shared_ptr assignment [tr.util.smartptr.shared.assign]
+
+// Assignment from incompatible auto_ptr<Y>
+int
+test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  std::tr1::shared_ptr<A> a;
+  std::auto_ptr<B> b;
+  a = b;                      // { dg-error "here" }
+
+  return 0;
+}
+
+int 
+main()
+{
+  test01();
+  return 0;
+}
+// { dg-error "In constructor" "" { target *-*-* } 0 }
+// { dg-error "cannot convert" "" { target *-*-* } 0 }
+// { dg-error "instantiated from" "" { target *-*-* } 0 }
Index: testsuite/tr1/2_general_utilities/memory/shared_ptr/assign/auto_ptr_rvalue_neg.cc
===================================================================
RCS file: testsuite/tr1/2_general_utilities/memory/shared_ptr/assign/auto_ptr_rvalue_neg.cc
diff -N testsuite/tr1/2_general_utilities/memory/shared_ptr/assign/auto_ptr_rvalue_neg.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/tr1/2_general_utilities/memory/shared_ptr/assign/auto_ptr_rvalue_neg.cc	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,48 @@
+// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// TR1 2.2.2 Template class shared_ptr [tr.util.smartptr.shared]
+
+#include <tr1/memory>
+#include <testsuite_hooks.h>
+
+struct A { };
+std::auto_ptr<A> source() { return std::auto_ptr<A>(); }
+
+// 2.2.3.3 shared_ptr assignment [tr.util.smartptr.shared.assign]
+
+// Assignment from rvalue auto_ptr
+int
+test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  std::tr1::shared_ptr<A> a;
+  a = source(); // { dg-error "no match" }
+
+  return 0;
+}
+
+int 
+main()
+{
+  test01();
+  return 0;
+}
+// { dg-error "auto_ptr" "" { target *-*-* } 0 }
+// { dg-error "shared_ptr" "" { target *-*-* } 0 }
Index: testsuite/tr1/2_general_utilities/memory/shared_ptr/assign/shared_ptr.cc
===================================================================
RCS file: testsuite/tr1/2_general_utilities/memory/shared_ptr/assign/shared_ptr.cc
diff -N testsuite/tr1/2_general_utilities/memory/shared_ptr/assign/shared_ptr.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/tr1/2_general_utilities/memory/shared_ptr/assign/shared_ptr.cc	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,95 @@
+// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// TR1 2.2.2 Template class shared_ptr [tr.util.smartptr.shared]
+
+#include <tr1/memory>
+#include <testsuite_hooks.h>
+
+struct A
+{
+  A() { ++ctor_count; }
+  virtual ~A() { ++dtor_count; }
+  static long ctor_count;
+  static long dtor_count;
+};
+long A::ctor_count = 0;
+long A::dtor_count = 0;
+
+struct B : A
+{
+  B() { ++ctor_count; }
+  virtual ~B() { ++dtor_count; }
+  static long ctor_count;
+  static long dtor_count;
+};
+long B::ctor_count = 0;
+long B::dtor_count = 0;
+
+
+struct reset_count_struct
+{
+  ~reset_count_struct()
+  {
+    A::ctor_count = 0;
+    A::dtor_count = 0;
+    B::ctor_count = 0;
+    B::dtor_count = 0;
+  }
+};
+
+
+// 2.2.3.3 shared_ptr assignment [tr.util.smartptr.shared.assign]
+
+// Assignment from shared_ptr<Y>
+int
+test01()
+{
+  reset_count_struct __attribute__((unused)) reset;
+  bool test __attribute__((unused)) = true;
+
+  std::tr1::shared_ptr<A> a;
+
+  a = std::tr1::shared_ptr<A>();
+  VERIFY( a.get() == 0 );
+  VERIFY( A::ctor_count == 0 );
+  VERIFY( A::dtor_count == 0 );
+  VERIFY( B::ctor_count == 0 );
+  VERIFY( B::dtor_count == 0 );
+
+  a = std::tr1::shared_ptr<A>(new A);
+  VERIFY( a.get() != 0 );
+  VERIFY( A::ctor_count == 1 );
+  VERIFY( A::dtor_count == 0 );
+  VERIFY( B::ctor_count == 0 );
+  VERIFY( B::dtor_count == 0 );
+
+  a = std::tr1::shared_ptr<B>(new B);
+  VERIFY( a.get() != 0 );
+  VERIFY( A::ctor_count == 2 );
+  VERIFY( A::dtor_count == 1 );
+  VERIFY( B::ctor_count == 1 );
+  VERIFY( B::dtor_count == 0 );
+}
+
+int 
+main()
+{
+  test01();
+  return 0;
+}
Index: testsuite/tr1/2_general_utilities/memory/shared_ptr/assign/shared_ptr_neg.cc
===================================================================
RCS file: testsuite/tr1/2_general_utilities/memory/shared_ptr/assign/shared_ptr_neg.cc
diff -N testsuite/tr1/2_general_utilities/memory/shared_ptr/assign/shared_ptr_neg.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/tr1/2_general_utilities/memory/shared_ptr/assign/shared_ptr_neg.cc	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,49 @@
+// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// TR1 2.2.2 Template class shared_ptr [tr.util.smartptr.shared]
+
+#include <tr1/memory>
+#include <testsuite_hooks.h>
+
+struct A { };
+struct B { };
+
+// 2.2.3.3 shared_ptr assignment [tr.util.smartptr.shared.assign]
+
+// Assignment from incompatible shared_ptr<Y>
+int
+test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  std::tr1::shared_ptr<A> a;
+  std::tr1::shared_ptr<B> b;
+  a = b;                      // { dg-error "here" }
+
+  return 0;
+}
+
+int 
+main()
+{
+  test01();
+  return 0;
+}
+// { dg-error "In member function" "" { target *-*-* } 0 }
+// { dg-error "cannot convert" "" { target *-*-* } 0 }
Index: testsuite/tr1/2_general_utilities/memory/shared_ptr/comparison/cmp.cc
===================================================================
RCS file: testsuite/tr1/2_general_utilities/memory/shared_ptr/comparison/cmp.cc
diff -N testsuite/tr1/2_general_utilities/memory/shared_ptr/comparison/cmp.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/tr1/2_general_utilities/memory/shared_ptr/comparison/cmp.cc	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,83 @@
+// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// TR1 2.2.2 Template class shared_ptr [tr.util.smartptr.shared]
+
+#include <tr1/memory>
+#include <testsuite_hooks.h>
+
+struct A
+{
+  virtual ~A() { }
+};
+
+struct B : A
+{
+};
+
+// 2.2.3.6 shared_ptr comparison [tr.util.smartptr.shared.cmp]
+
+int
+test01()
+{
+    // test empty shared_ptrs compare equivalent
+    std::tr1::shared_ptr<A> p1;
+    std::tr1::shared_ptr<B> p2;
+    VERIFY( p1 == p2 );
+    VERIFY( !(p1 != p2) );
+    VERIFY( !(p1 < p2) && !(p2 < p1) );
+    return 0;
+}
+
+
+// Construction from pointer
+int
+test02()
+{
+  std::tr1::shared_ptr<A> A_default;
+
+  std::tr1::shared_ptr<A> A_from_A(new A);
+  VERIFY( A_default != A_from_A );
+  VERIFY( !(A_default == A_from_A) );
+  VERIFY( (A_default < A_from_A) || (A_from_A < A_default) );
+
+  std::tr1::shared_ptr<B> B_from_B(new B);
+  VERIFY( B_from_B != A_from_A );
+  VERIFY( !(B_from_B == A_from_A) );
+  VERIFY( (B_from_B < A_from_A) || (A_from_A < B_from_B) );
+
+  A_from_A.reset();
+  VERIFY( A_default == A_from_A );
+  VERIFY( !(A_default != A_from_A) );
+  VERIFY( !(A_default < A_from_A) && !(A_from_A < A_default) );
+
+  B_from_B.reset();
+  VERIFY( B_from_B == A_from_A );
+  VERIFY( !(B_from_B != A_from_A) );
+  VERIFY( !(B_from_B < A_from_A) && !(A_from_A < B_from_B) );
+
+  return 0;
+}
+
+int 
+main()
+{
+  test01();
+  test02();
+  return 0;
+}
Index: testsuite/tr1/2_general_utilities/memory/shared_ptr/cons/auto_ptr.cc
===================================================================
RCS file: testsuite/tr1/2_general_utilities/memory/shared_ptr/cons/auto_ptr.cc
diff -N testsuite/tr1/2_general_utilities/memory/shared_ptr/cons/auto_ptr.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/tr1/2_general_utilities/memory/shared_ptr/cons/auto_ptr.cc	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,48 @@
+// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// TR1 2.2.2 Template class shared_ptr [tr.util.smartptr.shared]
+
+#include <tr1/memory>
+#include <testsuite_hooks.h>
+
+struct A { };
+
+// 2.2.3.1 shared_ptr constructors [tr.util.smartptr.shared.const]
+
+// Construction from auto_ptr
+int
+test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  std::auto_ptr<A> a(new A);
+  std::tr1::shared_ptr<A> a2(a);
+  VERIFY( a.get() == 0 );
+  VERIFY( a2.get() != 0 );
+  VERIFY( a2.use_count() == 1 );
+
+  return 0;
+}
+
+int
+main()
+{
+  test01();
+  return 0;
+}
Index: testsuite/tr1/2_general_utilities/memory/shared_ptr/cons/auto_ptr_neg.cc
===================================================================
RCS file: testsuite/tr1/2_general_utilities/memory/shared_ptr/cons/auto_ptr_neg.cc
diff -N testsuite/tr1/2_general_utilities/memory/shared_ptr/cons/auto_ptr_neg.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/tr1/2_general_utilities/memory/shared_ptr/cons/auto_ptr_neg.cc	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,48 @@
+// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// TR1 2.2.2 Template class shared_ptr [tr.util.smartptr.shared]
+
+#include <tr1/memory>
+#include <testsuite_hooks.h>
+
+struct A { };
+
+// 2.2.3.3 shared_ptr assignment [tr.util.smartptr.shared.const]
+
+// Construction from const auto_ptr
+int
+test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  const std::auto_ptr<A> a;
+  std::tr1::shared_ptr<A> p(a); // { dg-error "no match" }
+
+  return 0;
+}
+
+int 
+main()
+{
+  test01();
+  return 0;
+}
+// { dg-error "shared_ptr" "candidates are" { target *-*-* } 499 }
+
+// { dg-error "shared_ptr" "" { target *-*-* } 489 }
Index: testsuite/tr1/2_general_utilities/memory/shared_ptr/cons/copy.cc
===================================================================
RCS file: testsuite/tr1/2_general_utilities/memory/shared_ptr/cons/copy.cc
diff -N testsuite/tr1/2_general_utilities/memory/shared_ptr/cons/copy.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/tr1/2_general_utilities/memory/shared_ptr/cons/copy.cc	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,135 @@
+// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// TR1 2.2.2 Template class shared_ptr [tr.util.smartptr.shared]
+
+#include <tr1/memory>
+#include <testsuite_hooks.h>
+
+struct A
+{
+  A() { ++ctor_count; }
+  virtual ~A() { ++dtor_count; }
+  static long ctor_count;
+  static long dtor_count;
+};
+long A::ctor_count = 0;
+long A::dtor_count = 0;
+
+struct B : A
+{
+  B() { ++ctor_count; }
+  virtual ~B() { ++dtor_count; }
+  static long ctor_count;
+  static long dtor_count;
+};
+long B::ctor_count = 0;
+long B::dtor_count = 0;
+
+void deleter(A* p) { delete p; }
+
+struct reset_count_struct
+{
+  ~reset_count_struct()
+  {
+    A::ctor_count = 0;
+    A::dtor_count = 0;
+    B::ctor_count = 0;
+    B::dtor_count = 0;
+  }
+};
+
+// 2.2.3.1 shared_ptr constructors [tr.util.smartptr.shared.const]
+
+// Copy construction
+int test01()
+{
+  reset_count_struct __attribute__((unused)) reset;
+  bool test __attribute__((unused)) = true;
+
+  std::tr1::shared_ptr<A> a1;
+  std::tr1::shared_ptr<A> a2(a1);
+  VERIFY( a2.use_count() == 0 );
+  VERIFY( A::ctor_count == 0 );
+  VERIFY( A::dtor_count == 0 );
+  VERIFY( B::ctor_count == 0 );
+  VERIFY( B::dtor_count == 0 );
+
+  return 0;
+}
+
+int
+test02()
+{
+  reset_count_struct __attribute__((unused)) reset;
+  bool test __attribute__((unused)) = true;
+
+  std::tr1::shared_ptr<A> a1(new A);
+  std::tr1::shared_ptr<A> a2(a1);
+  VERIFY( a2.use_count() == 2 );
+  VERIFY( A::ctor_count == 1 );
+  VERIFY( A::dtor_count == 0 );
+  VERIFY( B::ctor_count == 0 );
+  VERIFY( B::dtor_count == 0 );
+
+  return 0;
+}
+
+int
+test03()
+{
+  reset_count_struct __attribute__((unused)) reset;
+  bool test __attribute__((unused)) = true;
+
+  std::tr1::shared_ptr<B> b(new B);
+  std::tr1::shared_ptr<A> a(b);
+  VERIFY( a.use_count() == 2 );
+  VERIFY( A::ctor_count == 1 );
+  VERIFY( A::dtor_count == 0 );
+  VERIFY( B::ctor_count == 1 );
+  VERIFY( B::dtor_count == 0 );
+
+  return 0;
+}
+
+int
+test04()
+{
+  reset_count_struct __attribute__((unused)) reset;
+  bool test __attribute__((unused)) = true;
+
+  std::tr1::shared_ptr<B> b(new B, &deleter);
+  std::tr1::shared_ptr<A> a(b);
+  VERIFY( a.use_count() == 2 );
+  VERIFY( A::ctor_count == 1 );
+  VERIFY( A::dtor_count == 0 );
+  VERIFY( B::ctor_count == 1 );
+  VERIFY( B::dtor_count == 0 );
+
+  return 0;
+}
+
+int
+main()
+{
+  test01();
+  test02();
+  test03();
+  test04();
+  return 0;
+}
Index: testsuite/tr1/2_general_utilities/memory/shared_ptr/cons/default.cc
===================================================================
RCS file: testsuite/tr1/2_general_utilities/memory/shared_ptr/cons/default.cc
diff -N testsuite/tr1/2_general_utilities/memory/shared_ptr/cons/default.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/tr1/2_general_utilities/memory/shared_ptr/cons/default.cc	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,45 @@
+// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// TR1 2.2.2 Template class shared_ptr [tr.util.smartptr.shared]
+
+#include <tr1/memory>
+#include <testsuite_hooks.h>
+
+struct A { };
+
+// 2.2.3.1 shared_ptr constructors [tr.util.smartptr.shared.const]
+
+// Default construction
+int
+test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  std::tr1::shared_ptr<A> a;
+  VERIFY( a.get() == 0 );
+
+  return 0;
+}
+
+int
+main()
+{
+  test01();
+  return 0;
+}
Index: testsuite/tr1/2_general_utilities/memory/shared_ptr/cons/pointer.cc
===================================================================
RCS file: testsuite/tr1/2_general_utilities/memory/shared_ptr/cons/pointer.cc
diff -N testsuite/tr1/2_general_utilities/memory/shared_ptr/cons/pointer.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/tr1/2_general_utilities/memory/shared_ptr/cons/pointer.cc	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,79 @@
+// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// TR1 2.2.2 Template class shared_ptr [tr.util.smartptr.shared]
+
+#include <tr1/memory>
+#include <testsuite_hooks.h>
+
+struct A { };
+struct B : A { };
+
+
+// 2.2.3.1 shared_ptr constructors [tr.util.smartptr.shared.const]
+
+// Construction from pointer
+
+int
+test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  A * const a = 0;
+  std::tr1::shared_ptr<A> p(a);
+  VERIFY( p.get() == 0 );
+  VERIFY( p.use_count() == 1 );
+
+  return 0;
+}
+
+int
+test02()
+{
+  bool test __attribute__((unused)) = true;
+
+  A * const a = new A;
+  std::tr1::shared_ptr<A> p(a);
+  VERIFY( p.get() == a );
+  VERIFY( p.use_count() == 1 );
+
+  return 0;
+}
+
+
+int
+test03()
+{
+  bool test __attribute__((unused)) = true;
+
+  B * const b = new B;
+  std::tr1::shared_ptr<A> p(b);
+  VERIFY( p.get() == b );
+  VERIFY( p.use_count() == 1 );
+
+  return 0;
+}
+
+int
+main()
+{
+  test01();
+  test02();
+  test02();
+  return 0;
+}
Index: testsuite/tr1/2_general_utilities/memory/shared_ptr/cons/weak_ptr.cc
===================================================================
RCS file: testsuite/tr1/2_general_utilities/memory/shared_ptr/cons/weak_ptr.cc
diff -N testsuite/tr1/2_general_utilities/memory/shared_ptr/cons/weak_ptr.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/tr1/2_general_utilities/memory/shared_ptr/cons/weak_ptr.cc	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,50 @@
+// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// TR1 2.2.2 Template class shared_ptr [tr.util.smartptr.shared]
+
+#include <tr1/memory>
+#include <testsuite_hooks.h>
+
+struct A { };
+
+// 2.2.3.1 shared_ptr constructors [tr.util.smartptr.shared.const]
+
+// Construction from weak_ptr
+int
+test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  A * const a = new A;
+  std::tr1::shared_ptr<A> a1(a);
+  std::tr1::weak_ptr<A> wa(a1);
+  std::tr1::shared_ptr<A> a2(wa);
+  VERIFY( a2.get() == a );
+  VERIFY( a2.use_count() == wa.use_count() );
+
+  return 0;
+}
+
+
+int
+main()
+{
+  test01();
+  return 0;
+}
Index: testsuite/tr1/2_general_utilities/memory/shared_ptr/cons/weak_ptr_expired.cc
===================================================================
RCS file: testsuite/tr1/2_general_utilities/memory/shared_ptr/cons/weak_ptr_expired.cc
diff -N testsuite/tr1/2_general_utilities/memory/shared_ptr/cons/weak_ptr_expired.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/tr1/2_general_utilities/memory/shared_ptr/cons/weak_ptr_expired.cc	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,60 @@
+// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// TR1 2.2.2 Template class shared_ptr [tr.util.smartptr.shared]
+
+#include <tr1/memory>
+#include <testsuite_hooks.h>
+
+struct A { };
+
+// 2.2.3.1 shared_ptr constructors [tr.util.smartptr.shared.const]
+
+// Construction from expired weak_ptr
+int
+test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  std::tr1::shared_ptr<A> a1(new A);
+  std::tr1::weak_ptr<A> wa(a1);
+  a1.reset();
+  try
+  {
+    std::tr1::shared_ptr<A> a2(wa);
+  }
+  catch (const std::tr1::bad_weak_ptr&)
+  {
+    // Expected.
+  }
+  catch (...)
+  {
+    // Failed.
+    __throw_exception_again;
+  }
+  VERIFY( wa.expired() );
+
+  return 0;
+}
+
+int
+main()
+{
+  test01();
+  return 0;
+}
Index: testsuite/tr1/2_general_utilities/memory/shared_ptr/dest/dest.cc
===================================================================
RCS file: testsuite/tr1/2_general_utilities/memory/shared_ptr/dest/dest.cc
diff -N testsuite/tr1/2_general_utilities/memory/shared_ptr/dest/dest.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/tr1/2_general_utilities/memory/shared_ptr/dest/dest.cc	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,133 @@
+// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// TR1 2.2.2 Template class shared_ptr [tr.util.smartptr.shared]
+
+#include <tr1/memory>
+#include <testsuite_hooks.h>
+
+struct A
+{
+  A() { ++ctor_count; }
+  ~A() { ++dtor_count; }
+  static long ctor_count;
+  static long dtor_count;
+};
+long A::ctor_count = 0;
+long A::dtor_count = 0;
+
+struct B : A
+{
+  B() { ++ctor_count; }
+  ~B() { ++dtor_count; }
+  static long ctor_count;
+  static long dtor_count;
+};
+long B::ctor_count = 0;
+long B::dtor_count = 0;
+
+struct D
+{
+  void operator()(const B* p) { delete p; ++delete_count; }
+  static long delete_count;
+};
+long D::delete_count = 0;
+
+struct reset_count_struct
+{
+  ~reset_count_struct()
+  {
+    A::ctor_count = 0;
+    A::dtor_count = 0;
+    B::ctor_count = 0;
+    B::dtor_count = 0;
+    D::delete_count = 0;
+  }
+};
+
+
+// 2.2.3.2 shared_ptr destructor [tr.util.smartptr.shared.dest]
+
+// empty shared_ptr
+int
+test01()
+{
+  reset_count_struct __attribute__((unused)) reset;
+  bool test __attribute__((unused)) = true;
+
+  {
+    std::tr1::shared_ptr<A> a;
+  }
+  VERIFY( A::ctor_count == 0 );
+  VERIFY( A::dtor_count == 0 );
+  VERIFY( B::ctor_count == 0 );
+  VERIFY( B::dtor_count == 0 );
+  VERIFY( D::delete_count == 0 );
+
+  return 0;
+}
+
+// shared ownership
+int
+test02()
+{
+  reset_count_struct __attribute__((unused)) reset;
+  bool test __attribute__((unused)) = true;
+
+  std::tr1::shared_ptr<A> a;
+  {
+    a = std::tr1::shared_ptr<A>(new B, D());
+  }
+  VERIFY( A::ctor_count == 1 );
+  VERIFY( A::dtor_count == 0 );
+  VERIFY( B::ctor_count == 1 );
+  VERIFY( B::dtor_count == 0 );
+  VERIFY( D::delete_count == 0 );
+
+  return 0;
+}
+
+// exclusive ownership
+int
+test03()
+{
+  reset_count_struct __attribute__((unused)) reset;
+  bool test __attribute__((unused)) = true;
+
+  {
+    std::tr1::shared_ptr<A> a1(new B);
+    std::tr1::shared_ptr<A> a2(new B, D());
+  }
+  VERIFY( A::ctor_count == 2 );
+  VERIFY( A::dtor_count == 2 );
+  VERIFY( B::ctor_count == 2 );
+  VERIFY( B::dtor_count == 2 );
+  VERIFY( D::delete_count == 1 );
+
+  return 0;
+}
+
+
+int
+main()
+{
+  test01();
+  test02();
+  test03();
+  return 0;
+}
Index: testsuite/tr1/2_general_utilities/memory/shared_ptr/misc/io.cc
===================================================================
RCS file: testsuite/tr1/2_general_utilities/memory/shared_ptr/misc/io.cc
diff -N testsuite/tr1/2_general_utilities/memory/shared_ptr/misc/io.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/tr1/2_general_utilities/memory/shared_ptr/misc/io.cc	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,51 @@
+// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// TR1 2.2.2 Template class shared_ptr [tr.util.smartptr.shared]
+
+#include <tr1/memory>
+#include <sstream>
+#include <testsuite_hooks.h>
+
+struct A { };
+
+// 2.2.3.7 shared_ptr I/O [tr.util.smartptr.shared.io]
+
+// operator<<
+int
+test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  std::tr1::shared_ptr<A> p(new A);
+  std::ostringstream buf;
+  buf << p;
+  const std::string s = buf.str();
+  buf.str("");
+  buf << p.get();
+  VERIFY( s == buf.str() );
+
+  return 0;
+}
+
+int 
+main()
+{
+  test01();
+  return 0;
+}
Index: testsuite/tr1/2_general_utilities/memory/shared_ptr/misc/swap.cc
===================================================================
RCS file: testsuite/tr1/2_general_utilities/memory/shared_ptr/misc/swap.cc
diff -N testsuite/tr1/2_general_utilities/memory/shared_ptr/misc/swap.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/tr1/2_general_utilities/memory/shared_ptr/misc/swap.cc	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,50 @@
+// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// TR1 2.2.2 Template class shared_ptr [tr.util.smartptr.shared]
+
+#include <tr1/memory>
+#include <testsuite_hooks.h>
+
+struct A { };
+
+// 2.2.3.8 shared_ptr specialized algorithms [tr.util.smartptr.shared.spec]
+
+// std::swap
+int
+test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  A * const a1 = new A;
+  A * const a2 = new A;
+  std::tr1::shared_ptr<A> p1(a1);
+  std::tr1::shared_ptr<A> p2(a2);
+  std::swap(p1, p2);
+  VERIFY( p1.get() == a2 );
+  VERIFY( p2.get() == a1 );
+
+  return 0;
+}
+
+int 
+main()
+{
+  test01();
+  return 0;
+}
Index: testsuite/tr1/2_general_utilities/memory/shared_ptr/modifiers/reset.cc
===================================================================
RCS file: testsuite/tr1/2_general_utilities/memory/shared_ptr/modifiers/reset.cc
diff -N testsuite/tr1/2_general_utilities/memory/shared_ptr/modifiers/reset.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/tr1/2_general_utilities/memory/shared_ptr/modifiers/reset.cc	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,88 @@
+// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// TR1 2.2.2 Template class shared_ptr [tr.util.smartptr.shared]
+
+#include <tr1/memory>
+#include <testsuite_hooks.h>
+
+struct A { };
+struct B : A { };
+struct D
+{
+  void operator()(B* p) { delete p; ++delete_count; }
+  static long delete_count;
+};
+long D::delete_count = 0;
+
+// 2.2.3.4 shared_ptr modifiers [tr.util.smartptr.shared.mod]
+
+// reset
+int
+test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  A * const a = new A;
+  std::tr1::shared_ptr<A> p1(a);
+  std::tr1::shared_ptr<A> p2(p1);
+  p1.reset();
+  VERIFY( p1.get() == 0 );
+  VERIFY( p2.get() == a );
+
+  return 0;
+}
+
+int
+test02()
+{
+  bool test __attribute__((unused)) = true;
+
+  A * const a = new A;
+  B * const b = new B;
+  std::tr1::shared_ptr<A> p1(a);
+  std::tr1::shared_ptr<A> p2(p1);
+  p1.reset(b);
+  VERIFY( p1.get() == b );
+  VERIFY( p2.get() == a );
+
+  return 0;
+}
+
+int
+test03()
+{
+  bool test __attribute__((unused)) = true;
+
+  {
+    std::tr1::shared_ptr<A> p1;
+    p1.reset(new B, D());
+  }
+  VERIFY( D::delete_count == 1 );
+
+  return 0;
+}   
+
+int
+main()
+{
+  test01();
+  test02();
+  test03();
+  return 0;
+}
Index: testsuite/tr1/2_general_utilities/memory/shared_ptr/modifiers/reset_neg.cc
===================================================================
RCS file: testsuite/tr1/2_general_utilities/memory/shared_ptr/modifiers/reset_neg.cc
diff -N testsuite/tr1/2_general_utilities/memory/shared_ptr/modifiers/reset_neg.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/tr1/2_general_utilities/memory/shared_ptr/modifiers/reset_neg.cc	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,45 @@
+// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// TR1 2.2.2 Template class shared_ptr [tr.util.smartptr.shared]
+
+#include <tr1/memory>
+#include <testsuite_hooks.h>
+
+struct A { };
+
+// 2.2.3.4 shared_ptr modifiers [tr.util.smartptr.shared.mod]
+
+// reset
+int
+test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  const std::tr1::shared_ptr<A> p1(new A);
+  p1.reset();     // { dg-error "discards qualifiers" }
+
+  return 0;
+}
+
+int
+main()
+{
+  test01();
+  return 0;
+}
Index: testsuite/tr1/2_general_utilities/memory/shared_ptr/modifiers/swap.cc
===================================================================
RCS file: testsuite/tr1/2_general_utilities/memory/shared_ptr/modifiers/swap.cc
diff -N testsuite/tr1/2_general_utilities/memory/shared_ptr/modifiers/swap.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/tr1/2_general_utilities/memory/shared_ptr/modifiers/swap.cc	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,50 @@
+// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// TR1 2.2.2 Template class shared_ptr [tr.util.smartptr.shared]
+
+#include <tr1/memory>
+#include <testsuite_hooks.h>
+
+struct A { };
+
+// 2.2.3.4 shared_ptr modifiers [tr.util.smartptr.shared.mod]
+
+// swap
+int
+test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  A * const a1 = new A;
+  A * const a2 = new A;
+  std::tr1::shared_ptr<A> p1(a1);
+  std::tr1::shared_ptr<A> p2(a2);
+  p1.swap(p2);
+  VERIFY( p1.get() == a2 );
+  VERIFY( p2.get() == a1 );
+
+  return 0;
+}
+
+int 
+main()
+{
+  test01();
+  return 0;
+}
Index: testsuite/tr1/2_general_utilities/memory/shared_ptr/modifiers/swap_neg.cc
===================================================================
RCS file: testsuite/tr1/2_general_utilities/memory/shared_ptr/modifiers/swap_neg.cc
diff -N testsuite/tr1/2_general_utilities/memory/shared_ptr/modifiers/swap_neg.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/tr1/2_general_utilities/memory/shared_ptr/modifiers/swap_neg.cc	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,46 @@
+// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// TR1 2.2.2 Template class shared_ptr [tr.util.smartptr.shared]
+
+#include <tr1/memory>
+#include <testsuite_hooks.h>
+
+struct A { };
+
+// 2.2.3.4 shared_ptr modifiers [tr.util.smartptr.shared.mod]
+
+// swap
+int
+test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  const std::tr1::shared_ptr<A> p1(new A);
+  std::tr1::shared_ptr<A> p2(new A);
+  p1.swap(p2);   // { dg-error "discards qualifiers" }
+
+  return 0;
+}
+
+int 
+main()
+{
+  test01();
+  return 0;
+}
Index: testsuite/tr1/2_general_utilities/memory/shared_ptr/observers/bool_conv.cc
===================================================================
RCS file: testsuite/tr1/2_general_utilities/memory/shared_ptr/observers/bool_conv.cc
diff -N testsuite/tr1/2_general_utilities/memory/shared_ptr/observers/bool_conv.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/tr1/2_general_utilities/memory/shared_ptr/observers/bool_conv.cc	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,80 @@
+// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// TR1 2.2.2 Template class shared_ptr [tr.util.smartptr.shared]
+
+#include <tr1/memory>
+#include <testsuite_hooks.h>
+
+struct A { };
+
+// 2.2.3.5 shared_ptr observers [tr.util.smartptr.shared.obs]
+
+// conversion to bool
+int
+test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  const std::tr1::shared_ptr<A> p1;
+  VERIFY( p1 == false );
+  const std::tr1::shared_ptr<A> p2(p1);
+  VERIFY( p2 == false );
+
+  return 0;
+}
+
+int
+test02()
+{
+  bool test __attribute__((unused)) = true;
+
+  std::tr1::shared_ptr<A> p1(new A);
+  VERIFY( p1 );
+  std::tr1::shared_ptr<A> p2(p1);
+  VERIFY( p2 );
+  p1.reset();
+  VERIFY( !p1 );
+  VERIFY( p2 );
+
+  return 0;
+}
+
+int
+test03()
+{
+  bool test __attribute__((unused)) = true;
+
+  std::tr1::shared_ptr<A> p1(new A);
+  std::tr1::shared_ptr<A> p2(p1);
+  p2.reset(new A);
+  VERIFY( p1 );
+  VERIFY( p2 );
+
+  return 0;
+}
+
+
+int 
+main()
+{
+  test01();
+  test02();
+  test03();
+  return 0;
+}
Index: testsuite/tr1/2_general_utilities/memory/shared_ptr/observers/get.cc
===================================================================
RCS file: testsuite/tr1/2_general_utilities/memory/shared_ptr/observers/get.cc
diff -N testsuite/tr1/2_general_utilities/memory/shared_ptr/observers/get.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/tr1/2_general_utilities/memory/shared_ptr/observers/get.cc	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,80 @@
+// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// TR1 2.2.2 Template class shared_ptr [tr.util.smartptr.shared]
+
+#include <tr1/memory>
+#include <testsuite_hooks.h>
+
+struct A
+{
+  A() : i() {}
+  int i;
+};
+
+// 2.2.3.5 shared_ptr observers [tr.util.smartptr.shared.obs]
+
+// get
+int
+test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  A * const a = new A;
+  const std::tr1::shared_ptr<A> p(a);
+  VERIFY( p.get() == a );
+
+  return 0;
+}
+
+// operator*
+int
+test02()
+{
+  bool test __attribute__((unused)) = true;
+
+  A * const a = new A;
+  const std::tr1::shared_ptr<A> p(a);
+  VERIFY( &*p == a );
+
+  return 0;
+}
+
+
+// operator->
+int
+test03()
+{
+  bool test __attribute__((unused)) = true;
+
+  A * const a = new A;
+  const std::tr1::shared_ptr<A> p(a);
+  VERIFY( &p->i == &a->i );
+
+  return 0;
+}
+
+
+int 
+main()
+{
+  test01();
+  test02();
+  test03();
+  return 0;
+}
Index: testsuite/tr1/2_general_utilities/memory/shared_ptr/observers/unique.cc
===================================================================
RCS file: testsuite/tr1/2_general_utilities/memory/shared_ptr/observers/unique.cc
diff -N testsuite/tr1/2_general_utilities/memory/shared_ptr/observers/unique.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/tr1/2_general_utilities/memory/shared_ptr/observers/unique.cc	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,80 @@
+// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// TR1 2.2.2 Template class shared_ptr [tr.util.smartptr.shared]
+
+#include <tr1/memory>
+#include <testsuite_hooks.h>
+
+struct A { };
+
+// 2.2.3.5 shared_ptr observers [tr.util.smartptr.shared.obs]
+
+// unique
+int
+test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  const std::tr1::shared_ptr<A> p1;
+  VERIFY( !p1.unique() );
+  const std::tr1::shared_ptr<A> p2(p1);
+  VERIFY( !p1.unique() );
+
+  return 0;
+}
+
+int
+test02()
+{
+  bool test __attribute__((unused)) = true;
+
+  std::tr1::shared_ptr<A> p1(new A);
+  VERIFY( p1.unique() );
+  std::tr1::shared_ptr<A> p2(p1);
+  VERIFY( !p1.unique() );
+  p1.reset();
+  VERIFY( !p1.unique() );
+  VERIFY( p2.unique() );
+
+  return 0;
+}
+
+int
+test03()
+{
+  bool test __attribute__((unused)) = true;
+
+  std::tr1::shared_ptr<A> p1(new A);
+  std::tr1::shared_ptr<A> p2(p1);
+  p2.reset(new A);
+  VERIFY( p1.unique() );
+  VERIFY( p2.unique() );
+
+  return 0;
+}
+
+
+int 
+main()
+{
+  test01();
+  test02();
+  test03();
+  return 0;
+}
Index: testsuite/tr1/2_general_utilities/memory/shared_ptr/observers/use_count.cc
===================================================================
RCS file: testsuite/tr1/2_general_utilities/memory/shared_ptr/observers/use_count.cc
diff -N testsuite/tr1/2_general_utilities/memory/shared_ptr/observers/use_count.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/tr1/2_general_utilities/memory/shared_ptr/observers/use_count.cc	21 Feb 2005 12:51:28 -0000
@@ -0,0 +1,79 @@
+// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// TR1 2.2.2 Template class shared_ptr [tr.util.smartptr.shared]
+
+#include <tr1/memory>
+#include <testsuite_hooks.h>
+
+struct A { };
+struct B : A { };
+
+// 2.2.3.5 shared_ptr observers [tr.util.smartptr.shared.obs]
+
+// use_count
+int
+test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  const std::tr1::shared_ptr<A> p1;
+  VERIFY( p1.use_count() == 0 );
+  const std::tr1::shared_ptr<A> p2(p1);
+  VERIFY( p1.use_count() == 0 );
+
+  return 0;
+}
+
+int
+test02()
+{
+  bool test __attribute__((unused)) = true;
+
+  std::tr1::shared_ptr<A> p1(new A);
+  std::tr1::shared_ptr<A> p2(p1);
+  p1.reset();
+  VERIFY( p1.use_count() == 0 );
+  VERIFY( p2.use_count() == 1 );
+
+  return 0;
+}
+
+int
+test03()
+{
+  bool test __attribute__((unused)) = true;
+
+  std::tr1::shared_ptr<A> p1(new A);
+  std::tr1::shared_ptr<A> p2(p1);
+  p2.reset(new B);
+  VERIFY( p1.use_count() == 1 );
+  VERIFY( p2.use_count() == 1 );
+
+  return 0;
+}
+
+
+int 
+main()
+{
+  test01();
+  test02();
+  test03();
+  return 0;
+}


More information about the Libstdc++ mailing list