[cfe-commits] [libcxx] r132261 - in /libcxx/trunk: include/__locale include/future include/memory include/type_traits src/future.cpp src/locale.cpp src/memory.cpp test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_destructible.pass.cpp

Howard Hinnant hhinnant at apple.com
Sat May 28 07:41:13 PDT 2011


Author: hhinnant
Date: Sat May 28 09:41:13 2011
New Revision: 132261

URL: http://llvm.org/viewvc/llvm-project?rev=132261&view=rev
Log:
noexcept for <memory>.  I've added a few extension noexcept to:  allocator_traits<A>::deallocate, allocaate<T>::deallocate, return_temporary_buffer, and default_delete<T>::operator()(T*) const.  My rationale was:  If a std-dicated noexcept function needs to call another std-defined function, that called function must be noexcept.  We're all a little new to noexcept, so things like this are to be expected.  Also included fix for broken __is_swappable trait pointed out by Marc Glisse, thanks Marc|.  And fixed a test case for is_nothrow_destructible.  Destructors are now noexcept by default|

Modified:
    libcxx/trunk/include/__locale
    libcxx/trunk/include/future
    libcxx/trunk/include/memory
    libcxx/trunk/include/type_traits
    libcxx/trunk/src/future.cpp
    libcxx/trunk/src/locale.cpp
    libcxx/trunk/src/memory.cpp
    libcxx/trunk/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_destructible.pass.cpp

Modified: libcxx/trunk/include/__locale
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__locale?rev=132261&r1=132260&r2=132261&view=diff
==============================================================================
--- libcxx/trunk/include/__locale (original)
+++ libcxx/trunk/include/__locale Sat May 28 09:41:13 2011
@@ -103,7 +103,7 @@
 //    facet(const facet&) = delete;     // effectively done in __shared_count
 //    void operator=(const facet&) = delete;
 private:
-    virtual void __on_zero_shared();
+    virtual void __on_zero_shared() _NOEXCEPT;
 };
 
 class _LIBCPP_VISIBLE locale::id

Modified: libcxx/trunk/include/future
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/future?rev=132261&r1=132260&r2=132261&view=diff
==============================================================================
--- libcxx/trunk/include/future (original)
+++ libcxx/trunk/include/future Sat May 28 09:41:13 2011
@@ -463,7 +463,7 @@
     mutable condition_variable __cv_;
     unsigned __state_;
 
-    virtual void __on_zero_shared();
+    virtual void __on_zero_shared() _NOEXCEPT;
     void __sub_wait(unique_lock<mutex>& __lk);
 public:
     enum
@@ -543,7 +543,7 @@
 protected:
     _U __value_;
 
-    virtual void __on_zero_shared();
+    virtual void __on_zero_shared() _NOEXCEPT;
 public:
 
     template <class _Arg>
@@ -566,7 +566,7 @@
 
 template <class _R>
 void
-__assoc_state<_R>::__on_zero_shared()
+__assoc_state<_R>::__on_zero_shared() _NOEXCEPT
 {
     if (this->__state_ & base::__constructed)
         reinterpret_cast<_R*>(&__value_)->~_R();
@@ -640,7 +640,7 @@
 protected:
     _U __value_;
 
-    virtual void __on_zero_shared();
+    virtual void __on_zero_shared() _NOEXCEPT;
 public:
 
     void set_value(_R& __arg);
@@ -651,7 +651,7 @@
 
 template <class _R>
 void
-__assoc_state<_R&>::__on_zero_shared()
+__assoc_state<_R&>::__on_zero_shared() _NOEXCEPT
 {
     delete this;
 }
@@ -700,7 +700,7 @@
     typedef __assoc_state<_R> base;
     _Alloc __alloc_;
 
-    virtual void __on_zero_shared();
+    virtual void __on_zero_shared() _NOEXCEPT;
 public:
     _LIBCPP_INLINE_VISIBILITY
     explicit __assoc_state_alloc(const _Alloc& __a)
@@ -709,7 +709,7 @@
 
 template <class _R, class _Alloc>
 void
-__assoc_state_alloc<_R, _Alloc>::__on_zero_shared()
+__assoc_state_alloc<_R, _Alloc>::__on_zero_shared() _NOEXCEPT
 {
     if (this->__state_ & base::__constructed)
         reinterpret_cast<_R*>(&this->__value_)->~_R();
@@ -725,7 +725,7 @@
     typedef __assoc_state<_R&> base;
     _Alloc __alloc_;
 
-    virtual void __on_zero_shared();
+    virtual void __on_zero_shared() _NOEXCEPT;
 public:
     _LIBCPP_INLINE_VISIBILITY
     explicit __assoc_state_alloc(const _Alloc& __a)
@@ -734,7 +734,7 @@
 
 template <class _R, class _Alloc>
 void
-__assoc_state_alloc<_R&, _Alloc>::__on_zero_shared()
+__assoc_state_alloc<_R&, _Alloc>::__on_zero_shared() _NOEXCEPT
 {
     typename _Alloc::template rebind<__assoc_state_alloc>::other __a(__alloc_);
     this->~__assoc_state_alloc();
@@ -748,7 +748,7 @@
     typedef __assoc_sub_state base;
     _Alloc __alloc_;
 
-    virtual void __on_zero_shared();
+    virtual void __on_zero_shared() _NOEXCEPT;
 public:
     _LIBCPP_INLINE_VISIBILITY
     explicit __assoc_sub_state_alloc(const _Alloc& __a)
@@ -757,7 +757,7 @@
 
 template <class _Alloc>
 void
-__assoc_sub_state_alloc<_Alloc>::__on_zero_shared()
+__assoc_sub_state_alloc<_Alloc>::__on_zero_shared() _NOEXCEPT
 {
     this->~base();
     typename _Alloc::template rebind<__assoc_sub_state_alloc>::other __a(__alloc_);
@@ -866,7 +866,7 @@
 
     _F __func_;
 
-    virtual void __on_zero_shared();
+    virtual void __on_zero_shared() _NOEXCEPT;
 public:
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
     explicit __async_assoc_state(_F&& __f);
@@ -906,7 +906,7 @@
 
 template <class _R, class _F>
 void
-__async_assoc_state<_R, _F>::__on_zero_shared()
+__async_assoc_state<_R, _F>::__on_zero_shared() _NOEXCEPT
 {
     this->wait();
     base::__on_zero_shared();
@@ -920,7 +920,7 @@
 
     _F __func_;
 
-    virtual void __on_zero_shared();
+    virtual void __on_zero_shared() _NOEXCEPT;
 public:
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
     explicit __async_assoc_state(_F&& __f);
@@ -961,7 +961,7 @@
 
 template <class _F>
 void
-__async_assoc_state<void, _F>::__on_zero_shared()
+__async_assoc_state<void, _F>::__on_zero_shared() _NOEXCEPT
 {
     this->wait();
     base::__on_zero_shared();

Modified: libcxx/trunk/include/memory
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/memory?rev=132261&r1=132260&r2=132261&view=diff
==============================================================================
--- libcxx/trunk/include/memory (original)
+++ libcxx/trunk/include/memory Sat May 28 09:41:13 2011
@@ -34,6 +34,18 @@
     static pointer pointer_to(<details>);
 };
 
+template <class T>
+struct pointer_traits<T*>
+{
+    typedef T* pointer;
+    typedef T element_type;
+    typedef ptrdiff_t difference_type;
+
+    template <class U> using rebind = U*;
+
+    static pointer pointer_to(<details>) noexcept;
+};
+
 template <class Alloc>
 struct allocator_traits
 {
@@ -70,7 +82,7 @@
     static pointer allocate(allocator_type& a, size_type n);
     static pointer allocate(allocator_type& a, size_type n, const_void_pointer hint);
 
-    static void deallocate(allocator_type& a, pointer p, size_type n);
+    static void deallocate(allocator_type& a, pointer p, size_type n) noexcept;
 
     template <class T, class... Args>
         static void construct(allocator_type& a, T* p, Args&&... args);
@@ -109,24 +121,26 @@
 
     template <class U> struct rebind {typedef allocator<U> other;};
 
-    allocator() throw();
-    allocator(const allocator&) throw();
-    template <class U> allocator(const allocator<U>&) throw();
-    ~allocator() throw();
-    pointer address(reference x) const;
-    const_pointer address(const_reference x) const;
+    allocator() noexcept;
+    allocator(const allocator&) noexcept;
+    template <class U> allocator(const allocator<U>&) noexcept;
+    ~allocator();
+    pointer address(reference x) const noexcept;
+    const_pointer address(const_reference x) const noexcept;
     pointer allocate(size_type, allocator<void>::const_pointer hint = 0);
-    void deallocate(pointer p, size_type n);
-    size_type max_size() const throw();
-    void construct(pointer p, const T& val);
-    void destroy(pointer p);
+    void deallocate(pointer p, size_type n) noexcept;
+    size_type max_size() const noexcept;
+    template<class U, class... Args>
+        void construct(U* p, Args&&... args);
+    template <class U>
+        void destroy(U* p);
 };
 
 template <class T, class U>
-bool operator==(const allocator<T>&, const allocator<U>&) throw();
+bool operator==(const allocator<T>&, const allocator<U>&) noexcept;
 
 template <class T, class U>
-bool operator!=(const allocator<T>&, const allocator<U>&) throw();
+bool operator!=(const allocator<T>&, const allocator<U>&) noexcept;
 
 template <class OutputIterator, class T>
 class raw_storage_iterator
@@ -144,13 +158,19 @@
     raw_storage_iterator  operator++(int);
 };
 
-template <class T> pair<T*,ptrdiff_t> get_temporary_buffer(ptrdiff_t n);
-template <class T> void               return_temporary_buffer(T* p);
+template <class T> pair<T*,ptrdiff_t> get_temporary_buffer(ptrdiff_t n) noexcept;
+template <class T> void               return_temporary_buffer(T* p) noexcept;
+
+template <class T> T* addressof(T& r) noexcept;
 
 template <class InputIterator, class ForwardIterator>
 ForwardIterator
 uninitialized_copy(InputIterator first, InputIterator last, ForwardIterator result);
 
+template <class InputIterator, class Size, class ForwardIterator>
+ForwardIterator
+uninitialized_copy_n(InputIterator first, Size n, ForwardIterator result);
+
 template <class ForwardIterator, class T>
 void uninitialized_fill(ForwardIterator first, ForwardIterator last, const T& x);
 
@@ -188,22 +208,20 @@
 template <class T>
 struct default_delete
 {
-    constexpr default_delete();
-    template <class U> default_delete(const default_delete<U>&);
+    constexpr default_delete() noexcept = default;
+    template <class U> default_delete(const default_delete<U>&) noexcept;
 
-    void operator()(T*) const;
+    void operator()(T*) const noexcept;
 };
 
 template <class T>
 struct default_delete<T[]>
 {
-    constexpr default_delete();
-    void operator()(T*) const;
+    constexpr default_delete() noexcept = default;
+    void operator()(T*) const noexcept;
     template <class U> void operator()(U*) const = delete;
 };
 
-template <class T, class D = default_delete<T>> class unique_ptr;
-
 template <class T, class D = default_delete<T>>
 class unique_ptr
 {
@@ -213,37 +231,37 @@
     typedef D deleter_type;
 
     // constructors
-    constexpr unique_ptr();
-    explicit unique_ptr(pointer p);
-    unique_ptr(pointer p, implementation-defined d1);
-    unique_ptr(pointer p, implementation-defined d2);
-    unique_ptr(unique_ptr&& u);
-    unique_ptr(nullptr_t) : unique_ptr() { }
+    constexpr unique_ptr() noexcept;
+    explicit unique_ptr(pointer p) noexcept;
+    unique_ptr(pointer p, see below d1) noexcept;
+    unique_ptr(pointer p, see below d2) noexcept;
+    unique_ptr(unique_ptr&& u) noexcept;
+    unique_ptr(nullptr_t) noexcept : unique_ptr() { }
     template <class U, class E>
-        unique_ptr(unique_ptr<U, E>&& u);
+        unique_ptr(unique_ptr<U, E>&& u) noexcept;
     template <class U>
-        unique_ptr(auto_ptr<U>&& u);
+        unique_ptr(auto_ptr<U>&& u) noexcept;
 
     // destructor
     ~unique_ptr();
 
     // assignment
-    unique_ptr& operator=(unique_ptr&& u);
-    template <class U, class E> unique_ptr& operator=(unique_ptr<U, E>&& u);
-    unique_ptr& operator=(nullptr_t);
+    unique_ptr& operator=(unique_ptr&& u) noexcept;
+    template <class U, class E> unique_ptr& operator=(unique_ptr<U, E>&& u) noexcept;
+    unique_ptr& operator=(nullptr_t) noexcept;
 
     // observers
     typename add_lvalue_reference<T>::type operator*() const;
-    pointer operator->() const;
-    pointer get() const;
-    deleter_type& get_deleter();
-    const deleter_type& get_deleter() const;
-    explicit operator bool() const;
+    pointer operator->() const noexcept;
+    pointer get() const noexcept;
+    deleter_type& get_deleter() noexcept;
+    const deleter_type& get_deleter() const noexcept;
+    explicit operator bool() const noexcept;
 
     // modifiers
-    pointer release();
-    void reset(pointer p = pointer());
-    void swap(unique_ptr& u);
+    pointer release() noexcept;
+    void reset(pointer p = pointer()) noexcept;
+    void swap(unique_ptr& u) noexcept;
 };
 
 template <class T, class D>
@@ -255,37 +273,37 @@
     typedef D deleter_type;
 
     // constructors
-    constexpr unique_ptr();
-    explicit unique_ptr(pointer p);
-    unique_ptr(pointer p, implementation-defined d);
-    unique_ptr(pointer p, implementation-defined d);
-    unique_ptr(unique_ptr&& u);
-    unique_ptr(nullptr_t) : unique_ptr() { }
+    constexpr unique_ptr() noexcept;
+    explicit unique_ptr(pointer p) noexcept;
+    unique_ptr(pointer p, see below d) noexcept;
+    unique_ptr(pointer p, see below d) noexcept;
+    unique_ptr(unique_ptr&& u) noexcept;
+    unique_ptr(nullptr_t) noexcept : unique_ptr() { }
 
     // destructor
     ~unique_ptr();
 
     // assignment
-    unique_ptr& operator=(unique_ptr&& u);
-    unique_ptr& operator=(nullptr_t);
+    unique_ptr& operator=(unique_ptr&& u) noexcept;
+    unique_ptr& operator=(nullptr_t) noexcept;
 
     // observers
     T& operator[](size_t i) const;
-    pointer get() const;
-    deleter_type& get_deleter();
-    const deleter_type& get_deleter() const;
-    explicit operator bool() const;
+    pointer get() const noexcept;
+    deleter_type& get_deleter() noexcept;
+    const deleter_type& get_deleter() const noexcept;
+    explicit operator bool() const noexcept;
 
     // modifiers
-    pointer release();
-    void reset(pointer p = pointer());
-    void reset(nullptr_t);
+    pointer release() noexcept;
+    void reset(pointer p = pointer()) noexcept;
+    void reset(nullptr_t) noexcept;
     template <class U> void reset(U) = delete;
-    void swap(unique_ptr& u);
+    void swap(unique_ptr& u) noexcept;
 };
 
 template <class T, class D>
-    void swap(unique_ptr<T, D>& x, unique_ptr<T, D>& y);
+    void swap(unique_ptr<T, D>& x, unique_ptr<T, D>& y) noexcept;
 
 template <class T1, class D1, class T2, class D2>
     bool operator==(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
@@ -300,10 +318,36 @@
 template <class T1, class D1, class T2, class D2>
     bool operator>=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
 
+template <class T, class D>
+    bool operator==(const unique_ptr<T, D>& x, nullptr_t) noexcept;
+template <class T, class D>
+    bool operator==(nullptr_t, const unique_ptr<T, D>& y) noexcept;
+template <class T, class D>
+    bool operator!=(const unique_ptr<T, D>& x, nullptr_t) noexcept;
+template <class T, class D>
+    bool operator!=(nullptr_t, const unique_ptr<T, D>& y) noexcept;
+
+template <class T, class D>
+    bool operator<(const unique_ptr<T, D>& x, nullptr_t);
+template <class T, class D>
+    bool operator<(nullptr_t, const unique_ptr<T, D>& y);
+template <class T, class D>
+    bool operator<=(const unique_ptr<T, D>& x, nullptr_t);
+template <class T, class D>
+    bool operator<=(nullptr_t, const unique_ptr<T, D>& y);
+template <class T, class D>
+    bool operator>(const unique_ptr<T, D>& x, nullptr_t);
+template <class T, class D>
+    bool operator>(nullptr_t, const unique_ptr<T, D>& y);
+template <class T, class D>
+    bool operator>=(const unique_ptr<T, D>& x, nullptr_t);
+template <class T, class D>
+    bool operator>=(nullptr_t, const unique_ptr<T, D>& y);
+
 class bad_weak_ptr
     : public std::exception
 {
-    bad_weak_ptr();
+    bad_weak_ptr() noexcept;
 };
 
 template<class T>
@@ -313,17 +357,17 @@
     typedef T element_type;
 
     // constructors:
-    constexpr shared_ptr();
+    constexpr shared_ptr() noexcept;
     template<class Y> explicit shared_ptr(Y* p);
     template<class Y, class D> shared_ptr(Y* p, D d);
     template<class Y, class D, class A> shared_ptr(Y* p, D d, A a);
     template <class D> shared_ptr(nullptr_t p, D d);
     template <class D, class A> shared_ptr(nullptr_t p, D d, A a);
-    template<class Y> shared_ptr(const shared_ptr<Y>& r, T *p);
-    shared_ptr(const shared_ptr& r);
-    template<class Y> shared_ptr(const shared_ptr<Y>& r);
-    shared_ptr(shared_ptr&& r);
-    template<class Y> shared_ptr(shared_ptr<Y>&& r);
+    template<class Y> shared_ptr(const shared_ptr<Y>& r, T *p) noexcept;
+    shared_ptr(const shared_ptr& r) noexcept;
+    template<class Y> shared_ptr(const shared_ptr<Y>& r) noexcept;
+    shared_ptr(shared_ptr&& r) noexcept;
+    template<class Y> shared_ptr(shared_ptr<Y>&& r) noexcept;
     template<class Y> explicit shared_ptr(const weak_ptr<Y>& r);
     template<class Y> shared_ptr(auto_ptr<Y>&& r);
     template <class Y, class D> shared_ptr(unique_ptr<Y, D>&& r);
@@ -333,61 +377,87 @@
     ~shared_ptr();
 
     // assignment:
-    shared_ptr& operator=(const shared_ptr& r);
-    template<class Y> shared_ptr& operator=(const shared_ptr<Y>& r);
-    shared_ptr& operator=(shared_ptr&& r);
+    shared_ptr& operator=(const shared_ptr& r) noexcept;
+    template<class Y> shared_ptr& operator=(const shared_ptr<Y>& r) noexcept;
+    shared_ptr& operator=(shared_ptr&& r) noexcept;
     template<class Y> shared_ptr& operator=(shared_ptr<Y>&& r);
     template<class Y> shared_ptr& operator=(auto_ptr<Y>&& r);
     template <class Y, class D> shared_ptr& operator=(unique_ptr<Y, D>&& r);
 
     // modifiers:
-    void swap(shared_ptr& r);
-    void reset();
+    void swap(shared_ptr& r) noexcept;
+    void reset() noexcept;
     template<class Y> void reset(Y* p);
     template<class Y, class D> void reset(Y* p, D d);
     template<class Y, class D, class A> void reset(Y* p, D d, A a);
 
-    // observers: T* get() const;
-    T& operator*() const;
-    T* operator->() const;
-    long use_count() const;
-    bool unique() const;
-    explicit operator bool() const;
+    // observers:
+    T* get() const noexcept;
+    T& operator*() const noexcept;
+    T* operator->() const noexcept;
+    long use_count() const noexcept;
+    bool unique() const noexcept;
+    explicit operator bool() const noexcept;
     template<class U> bool owner_before(shared_ptr<U> const& b) const;
     template<class U> bool owner_before(weak_ptr<U> const& b) const;
 };
 
 // shared_ptr comparisons:
 template<class T, class U>
-    bool operator==(shared_ptr<T> const& a, shared_ptr<U> const& b);
+    bool operator==(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept;
 template<class T, class U>
-    bool operator!=(shared_ptr<T> const& a, shared_ptr<U> const& b);
+    bool operator!=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept;
 template<class T, class U>
-    bool operator<(shared_ptr<T> const& a, shared_ptr<U> const& b);
+    bool operator<(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept;
 template<class T, class U>
-    bool operator>(shared_ptr<T> const& a, shared_ptr<U> const& b);
+    bool operator>(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept;
 template<class T, class U>
-    bool operator<=(shared_ptr<T> const& a, shared_ptr<U> const& b);
+    bool operator<=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept;
 template<class T, class U>
-    bool operator>=(shared_ptr<T> const& a, shared_ptr<U> const& b);
+    bool operator>=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept;
+
+template <class T>
+    bool operator==(const shared_ptr<T>& x, nullptr_t) noexcept;
+template <class T>
+    bool operator==(nullptr_t, const shared_ptr<T>& y) noexcept;
+template <class T>
+    bool operator!=(const shared_ptr<T>& x, nullptr_t) noexcept;
+template <class T>
+    bool operator!=(nullptr_t, const shared_ptr<T>& y) noexcept;
+template <class T>
+    bool operator<(const shared_ptr<T>& x, nullptr_t) noexcept;
+template <class T>
+bool operator<(nullptr_t, const shared_ptr<T>& y) noexcept;
+template <class T>
+    bool operator<=(const shared_ptr<T>& x, nullptr_t) noexcept;
+template <class T>
+    bool operator<=(nullptr_t, const shared_ptr<T>& y) noexcept;
+template <class T>
+    bool operator>(const shared_ptr<T>& x, nullptr_t) noexcept;
+template <class T>
+    bool operator>(nullptr_t, const shared_ptr<T>& y) noexcept;
+template <class T>
+    bool operator>=(const shared_ptr<T>& x, nullptr_t) noexcept;
+template <class T>
+    bool operator>=(nullptr_t, const shared_ptr<T>& y) noexcept;
 
 // shared_ptr specialized algorithms:
-template<class T> void swap(shared_ptr<T>& a, shared_ptr<T>& b);
+template<class T> void swap(shared_ptr<T>& a, shared_ptr<T>& b) noexcept;
 
 // shared_ptr casts:
 template<class T, class U>
-    shared_ptr<T> static_pointer_cast(shared_ptr<U> const& r);
+    shared_ptr<T> static_pointer_cast(shared_ptr<U> const& r) noexcept;
 template<class T, class U>
-    shared_ptr<T> dynamic_pointer_cast(shared_ptr<U> const& r);
+    shared_ptr<T> dynamic_pointer_cast(shared_ptr<U> const& r) noexcept;
 template<class T, class U>
-    shared_ptr<T> const_pointer_cast(shared_ptr<U> const& r);
+    shared_ptr<T> const_pointer_cast(shared_ptr<U> const& r) noexcept;
 
 // shared_ptr I/O:
 template<class E, class T, class Y>
     basic_ostream<E, T>& operator<< (basic_ostream<E, T>& os, shared_ptr<Y> const& p);
 
 // shared_ptr get_deleter:
-template<class D, class T> D* get_deleter(shared_ptr<T> const& p);
+template<class D, class T> D* get_deleter(shared_ptr<T> const& p) noexcept;
 
 template<class T, class... Args>
     shared_ptr<T> make_shared(Args&&... args);
@@ -401,33 +471,33 @@
     typedef T element_type;
 
     // constructors
-    constexpr weak_ptr();
-    template<class Y> weak_ptr(shared_ptr<Y> const& r);
-    weak_ptr(weak_ptr const& r);
-    template<class Y> weak_ptr(weak_ptr<Y> const& r);
+    constexpr weak_ptr() noexcept;
+    template<class Y> weak_ptr(shared_ptr<Y> const& r) noexcept;
+    weak_ptr(weak_ptr const& r) noexcept;
+    template<class Y> weak_ptr(weak_ptr<Y> const& r) noexcept;
 
     // destructor
     ~weak_ptr();
 
     // assignment
-    weak_ptr& operator=(weak_ptr const& r);
-    template<class Y> weak_ptr& operator=(weak_ptr<Y> const& r);
-    template<class Y> weak_ptr& operator=(shared_ptr<Y> const& r);
+    weak_ptr& operator=(weak_ptr const& r) noexcept;
+    template<class Y> weak_ptr& operator=(weak_ptr<Y> const& r) noexcept;
+    template<class Y> weak_ptr& operator=(shared_ptr<Y> const& r) noexcept;
 
     // modifiers
-    void swap(weak_ptr& r);
-    void reset();
+    void swap(weak_ptr& r) noexcept;
+    void reset() noexcept;
 
     // observers
-    long use_count() const;
-    bool expired() const;
-    shared_ptr<T> lock() const;
+    long use_count() const noexcept;
+    bool expired() const noexcept;
+    shared_ptr<T> lock() const noexcept;
     template<class U> bool owner_before(shared_ptr<U> const& b);
     template<class U> bool owner_before(weak_ptr<U> const& b);
 };
 
 // weak_ptr specialized algorithms:
-template<class T> void swap(weak_ptr<T>& a, weak_ptr<T>& b);
+template<class T> void swap(weak_ptr<T>& a, weak_ptr<T>& b) noexcept;
 
 // class owner_less:
 template<class T> struct owner_less;
@@ -456,9 +526,9 @@
 class enable_shared_from_this
 {
 protected:
-    constexpr enable_shared_from_this();
-    enable_shared_from_this(enable_shared_from_this const&);
-    enable_shared_from_this& operator=(enable_shared_from_this const&);
+    constexpr enable_shared_from_this() noexcept;
+    enable_shared_from_this(enable_shared_from_this const&) noexcept;
+    enable_shared_from_this& operator=(enable_shared_from_this const&) noexcept;
     ~enable_shared_from_this();
 public:
     shared_ptr<T> shared_from_this();
@@ -507,7 +577,7 @@
 template <class T> T *undeclare_reachable(T *p);
 void declare_no_pointers(char *p, size_t n);
 void undeclare_no_pointers(char *p, size_t n);
-pointer_safety get_pointer_safety();
+pointer_safety get_pointer_safety() noexcept;
 
 void* align(size_t alignment, size_t size, void*& ptr, size_t& space);
 
@@ -544,7 +614,7 @@
 template <class _Tp>
 inline _LIBCPP_INLINE_VISIBILITY
 _Tp*
-addressof(_Tp& __x)
+addressof(_Tp& __x) _NOEXCEPT
 {
     return (_Tp*)&(char&)__x;
 }
@@ -827,7 +897,7 @@
 public:
     _LIBCPP_INLINE_VISIBILITY
     static pointer pointer_to(typename conditional<is_void<element_type>::value,
-                                           __nat, element_type>::type& __r)
+                                      __nat, element_type>::type& __r) _NOEXCEPT
         {return _STD::addressof(__r);}
 };
 
@@ -952,7 +1022,7 @@
 template <class _T>
 inline _LIBCPP_INLINE_VISIBILITY
 _T*
-__to_raw_pointer(_T* __p)
+__to_raw_pointer(_T* __p) _NOEXCEPT
 {
     return __p;
 }
@@ -960,7 +1030,7 @@
 template <class _Pointer>
 inline _LIBCPP_INLINE_VISIBILITY
 typename pointer_traits<_Pointer>::element_type*
-__to_raw_pointer(_Pointer __p)
+__to_raw_pointer(_Pointer __p) _NOEXCEPT
 {
     return _STD::__to_raw_pointer(__p.operator->());
 }
@@ -1349,7 +1419,7 @@
             __has_allocate_hint<allocator_type, size_type, const_void_pointer>());}
 
     _LIBCPP_INLINE_VISIBILITY
-    static void deallocate(allocator_type& __a, pointer __p, size_type __n)
+    static void deallocate(allocator_type& __a, pointer __p, size_type __n) _NOEXCEPT
         {__a.deallocate(__p, __n);}
 
 #ifndef _LIBCPP_HAS_NO_VARIADICS
@@ -1523,14 +1593,18 @@
 
     template <class _Up> struct rebind {typedef allocator<_Up> other;};
 
-    _LIBCPP_INLINE_VISIBILITY allocator() throw() {}
-    template <class _Up> _LIBCPP_INLINE_VISIBILITY allocator(const allocator<_Up>&) throw() {}
-    _LIBCPP_INLINE_VISIBILITY pointer address(reference __x) const             {return _STD::addressof(__x);}
-    _LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const {return _STD::addressof(__x);}
+    _LIBCPP_INLINE_VISIBILITY allocator() _NOEXCEPT {}
+    template <class _Up> _LIBCPP_INLINE_VISIBILITY allocator(const allocator<_Up>&) _NOEXCEPT {}
+    _LIBCPP_INLINE_VISIBILITY pointer address(reference __x) const _NOEXCEPT
+        {return _STD::addressof(__x);}
+    _LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const _NOEXCEPT
+        {return _STD::addressof(__x);}
     _LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, allocator<void>::const_pointer = 0)
         {return static_cast<pointer>(::operator new(__n * sizeof(_Tp)));}
-    _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type) {::operator delete((void*)__p);}
-    _LIBCPP_INLINE_VISIBILITY size_type max_size() const throw() {return size_type(~0) / sizeof(_Tp);}
+    _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type) _NOEXCEPT
+        {::operator delete((void*)__p);}
+    _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT
+        {return size_type(~0) / sizeof(_Tp);}
 #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
     template <class _Up, class... _Args>
         _LIBCPP_INLINE_VISIBILITY
@@ -1615,11 +1689,11 @@
 
 template <class _Tp, class _Up>
 inline _LIBCPP_INLINE_VISIBILITY
-bool operator==(const allocator<_Tp>&, const allocator<_Up>&) throw() {return true;}
+bool operator==(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return true;}
 
 template <class _Tp, class _Up>
 inline _LIBCPP_INLINE_VISIBILITY
-bool operator!=(const allocator<_Tp>&, const allocator<_Up>&) throw() {return false;}
+bool operator!=(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return false;}
 
 template <class _OutputIterator, class _Tp>
 class _LIBCPP_VISIBLE raw_storage_iterator
@@ -1643,7 +1717,7 @@
 
 template <class _Tp>
 pair<_Tp*, ptrdiff_t>
-get_temporary_buffer(ptrdiff_t __n)
+get_temporary_buffer(ptrdiff_t __n) _NOEXCEPT
 {
     pair<_Tp*, ptrdiff_t> __r(0, 0);
     const ptrdiff_t __m = (~ptrdiff_t(0) ^
@@ -1666,7 +1740,7 @@
 
 template <class _Tp>
 inline _LIBCPP_INLINE_VISIBILITY
-void return_temporary_buffer(_Tp* __p) {::operator delete(__p);}
+void return_temporary_buffer(_Tp* __p) _NOEXCEPT {::operator delete(__p);}
 
 template <class _Tp>
 struct auto_ptr_ref
@@ -1775,16 +1849,20 @@
 
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
     _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p)
+        _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value &&
+                   is_nothrow_move_constructible<_T2>::value)
         : __first_(_STD::forward<_T1>(__p.first())), __second_(_STD::forward<_T2>(__p.second())) {}
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
 
-    _LIBCPP_INLINE_VISIBILITY _T1_reference       first()       {return __first_;}
-    _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const {return __first_;}
+    _LIBCPP_INLINE_VISIBILITY _T1_reference       first() _NOEXCEPT       {return __first_;}
+    _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return __first_;}
 
-    _LIBCPP_INLINE_VISIBILITY _T2_reference       second()       {return __second_;}
-    _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const {return __second_;}
+    _LIBCPP_INLINE_VISIBILITY _T2_reference       second() _NOEXCEPT       {return __second_;}
+    _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return __second_;}
 
     _LIBCPP_INLINE_VISIBILITY void swap(__libcpp_compressed_pair_imp& __x)
+        _NOEXCEPT_(__is_nothrow_swappable<_T1>::value &&
+                   __is_nothrow_swappable<_T1>::value)
     {
         using _STD::swap;
         swap(__first_, __x.__first_);
@@ -1818,16 +1896,20 @@
 
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
     _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p)
+        _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value &&
+                   is_nothrow_move_constructible<_T2>::value)
         : _T1(_STD::move(__p.first())), __second_(_STD::forward<_T2>(__p.second())) {}
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
 
-    _LIBCPP_INLINE_VISIBILITY _T1_reference       first()       {return *this;}
-    _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const {return *this;}
+    _LIBCPP_INLINE_VISIBILITY _T1_reference       first() _NOEXCEPT       {return *this;}
+    _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return *this;}
 
-    _LIBCPP_INLINE_VISIBILITY _T2_reference       second()       {return __second_;}
-    _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const {return __second_;}
+    _LIBCPP_INLINE_VISIBILITY _T2_reference       second() _NOEXCEPT       {return __second_;}
+    _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return __second_;}
 
     _LIBCPP_INLINE_VISIBILITY void swap(__libcpp_compressed_pair_imp& __x)
+        _NOEXCEPT_(__is_nothrow_swappable<_T1>::value &&
+                   __is_nothrow_swappable<_T1>::value)
     {
         using _STD::swap;
         swap(__second_, __x.__second_);
@@ -1856,6 +1938,8 @@
     _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T2_param __t2)
         : _T2(_STD::forward<_T2_param>(__t2)) {}
     _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2)
+        _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value &&
+                   is_nothrow_move_constructible<_T2>::value)
         : _T2(_STD::forward<_T2_param>(__t2)), __first_(_STD::forward<_T1_param>(__t1)) {}
 
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
@@ -1863,13 +1947,15 @@
         : _T2(_STD::forward<_T2>(__p.second())), __first_(_STD::move(__p.first())) {}
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
 
-    _LIBCPP_INLINE_VISIBILITY _T1_reference       first()       {return __first_;}
-    _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const {return __first_;}
+    _LIBCPP_INLINE_VISIBILITY _T1_reference       first() _NOEXCEPT       {return __first_;}
+    _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return __first_;}
 
-    _LIBCPP_INLINE_VISIBILITY _T2_reference       second()       {return *this;}
-    _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const {return *this;}
+    _LIBCPP_INLINE_VISIBILITY _T2_reference       second() _NOEXCEPT       {return *this;}
+    _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return *this;}
 
     _LIBCPP_INLINE_VISIBILITY void swap(__libcpp_compressed_pair_imp& __x)
+        _NOEXCEPT_(__is_nothrow_swappable<_T1>::value &&
+                   __is_nothrow_swappable<_T1>::value)
     {
         using _STD::swap;
         swap(__first_, __x.__first_);
@@ -1901,16 +1987,20 @@
 
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
     _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p)
+        _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value &&
+                   is_nothrow_move_constructible<_T2>::value)
         : _T1(_STD::move(__p.first())), _T2(_STD::move(__p.second())) {}
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
 
-    _LIBCPP_INLINE_VISIBILITY _T1_reference       first()       {return *this;}
-    _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const {return *this;}
+    _LIBCPP_INLINE_VISIBILITY _T1_reference       first() _NOEXCEPT       {return *this;}
+    _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return *this;}
 
-    _LIBCPP_INLINE_VISIBILITY _T2_reference       second()       {return *this;}
-    _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const {return *this;}
+    _LIBCPP_INLINE_VISIBILITY _T2_reference       second() _NOEXCEPT       {return *this;}
+    _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return *this;}
 
     _LIBCPP_INLINE_VISIBILITY void swap(__libcpp_compressed_pair_imp& __x)
+        _NOEXCEPT_(__is_nothrow_swappable<_T1>::value &&
+                   __is_nothrow_swappable<_T1>::value)
     {
     }
 };
@@ -1940,32 +2030,39 @@
 
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
     __compressed_pair(__compressed_pair&& __p)
+        _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value &&
+                   is_nothrow_move_constructible<_T2>::value)
         : base(_STD::move(__p)) {}
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
 
-    _LIBCPP_INLINE_VISIBILITY _T1_reference       first()       {return base::first();}
-    _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const {return base::first();}
+    _LIBCPP_INLINE_VISIBILITY _T1_reference       first() _NOEXCEPT       {return base::first();}
+    _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return base::first();}
 
-    _LIBCPP_INLINE_VISIBILITY _T2_reference       second()       {return base::second();}
-    _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const {return base::second();}
+    _LIBCPP_INLINE_VISIBILITY _T2_reference       second() _NOEXCEPT       {return base::second();}
+    _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return base::second();}
 
-    _LIBCPP_INLINE_VISIBILITY void swap(__compressed_pair& __x) {base::swap(__x);}
+    _LIBCPP_INLINE_VISIBILITY void swap(__compressed_pair& __x)
+        _NOEXCEPT_(__is_nothrow_swappable<_T1>::value &&
+                   __is_nothrow_swappable<_T1>::value)
+        {base::swap(__x);}
 };
 
 template <class _T1, class _T2>
 inline _LIBCPP_INLINE_VISIBILITY
 void
 swap(__compressed_pair<_T1, _T2>& __x, __compressed_pair<_T1, _T2>& __y)
+        _NOEXCEPT_(__is_nothrow_swappable<_T1>::value &&
+                   __is_nothrow_swappable<_T1>::value)
     {__x.swap(__y);}
 
 template <class _Tp>
 struct _LIBCPP_VISIBLE default_delete
 {
-    _LIBCPP_INLINE_VISIBILITY default_delete() {}
+    _LIBCPP_INLINE_VISIBILITY default_delete() _NOEXCEPT {}
     template <class _Up>
         _LIBCPP_INLINE_VISIBILITY default_delete(const default_delete<_Up>&,
-                      typename enable_if<is_convertible<_Up*, _Tp*>::value>::type* = 0) {}
-    _LIBCPP_INLINE_VISIBILITY void operator() (_Tp* __ptr) const
+             typename enable_if<is_convertible<_Up*, _Tp*>::value>::type* = 0) _NOEXCEPT {}
+    _LIBCPP_INLINE_VISIBILITY void operator() (_Tp* __ptr) const _NOEXCEPT
         {
             static_assert(sizeof(_Tp) > 0, "default_delete can not delete incomplete type");
             delete __ptr;
@@ -1975,7 +2072,7 @@
 template <class _Tp>
 struct _LIBCPP_VISIBLE default_delete<_Tp[]>
 {
-    _LIBCPP_INLINE_VISIBILITY void operator() (_Tp* __ptr) const
+    _LIBCPP_INLINE_VISIBILITY void operator() (_Tp* __ptr) const _NOEXCEPT
         {
             static_assert(sizeof(_Tp) > 0, "default_delete can not delete incomplete type");
             delete [] __ptr;
@@ -2015,19 +2112,19 @@
     typedef       typename remove_reference<deleter_type>::type& _Dp_reference;
     typedef const typename remove_reference<deleter_type>::type& _Dp_const_reference;
 public:
-    _LIBCPP_INLINE_VISIBILITY unique_ptr()
+    _LIBCPP_INLINE_VISIBILITY unique_ptr() _NOEXCEPT
         : __ptr_(pointer())
         {
             static_assert(!is_pointer<deleter_type>::value,
                 "unique_ptr constructed with null function pointer deleter");
         }
-    _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t)
+    _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t) _NOEXCEPT
         : __ptr_(pointer())
         {
             static_assert(!is_pointer<deleter_type>::value,
                 "unique_ptr constructed with null function pointer deleter");
         }
-    _LIBCPP_INLINE_VISIBILITY explicit unique_ptr(pointer __p)
+    _LIBCPP_INLINE_VISIBILITY explicit unique_ptr(pointer __p) _NOEXCEPT
         : __ptr_(_STD::move(__p))
         {
             static_assert(!is_pointer<deleter_type>::value,
@@ -2039,14 +2136,16 @@
                                         is_reference<deleter_type>::value,
                                         deleter_type,
                                         typename add_lvalue_reference<const deleter_type>::type>::type __d)
+             _NOEXCEPT
         : __ptr_(__p, __d) {}
 
     _LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, typename remove_reference<deleter_type>::type&& __d)
+             _NOEXCEPT
         : __ptr_(__p, _STD::move(__d))
         {
             static_assert(!is_reference<deleter_type>::value, "rvalue deleter bound to reference");
         }
-    _LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u)
+    _LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u) _NOEXCEPT
         : __ptr_(__u.release(), _STD::forward<deleter_type>(__u.get_deleter())) {}
     template <class _Up, class _Ep>
         _LIBCPP_INLINE_VISIBILITY
@@ -2061,7 +2160,7 @@
                             is_same<deleter_type, _Ep>::value
                          ),
                          __nat
-                      >::type = __nat())
+                      >::type = __nat()) _NOEXCEPT
             : __ptr_(__u.release(), _STD::forward<_Ep>(__u.get_deleter())) {}
 
     template <class _Up>
@@ -2070,12 +2169,12 @@
                                       is_convertible<_Up*, _Tp*>::value &&
                                       is_same<_Dp, default_delete<_Tp> >::value,
                                       __nat
-                                  >::type = __nat())
+                                  >::type = __nat()) _NOEXCEPT
             : __ptr_(__p.release())
             {
             }
 
-        _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(unique_ptr&& __u)
+        _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(unique_ptr&& __u) _NOEXCEPT
             {
                 reset(__u.release());
                 __ptr_.second() = _STD::forward<deleter_type>(__u.get_deleter());
@@ -2089,7 +2188,7 @@
                 !is_array<_Up>::value,
                 unique_ptr&
             >::type
-            operator=(unique_ptr<_Up, _Ep>&& __u)
+            operator=(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT
             {
                 reset(__u.release());
                 __ptr_.second() = _STD::forward<_Ep>(__u.get_deleter());
@@ -2129,7 +2228,7 @@
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
     _LIBCPP_INLINE_VISIBILITY ~unique_ptr() {reset();}
 
-    _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(nullptr_t)
+    _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(nullptr_t) _NOEXCEPT
     {
         reset();
         return *this;
@@ -2137,20 +2236,24 @@
 
     _LIBCPP_INLINE_VISIBILITY typename add_lvalue_reference<_Tp>::type operator*() const
         {return *__ptr_.first();}
-    _LIBCPP_INLINE_VISIBILITY pointer operator->() const {return __ptr_.first();}
-    _LIBCPP_INLINE_VISIBILITY pointer get() const {return __ptr_.first();}
-    _LIBCPP_INLINE_VISIBILITY       _Dp_reference get_deleter()       {return __ptr_.second();}
-    _LIBCPP_INLINE_VISIBILITY _Dp_const_reference get_deleter() const {return __ptr_.second();}
-    _LIBCPP_INLINE_VISIBILITY operator int __nat::*() const {return __ptr_.first() ? &__nat::__for_bool_ : 0;}
+    _LIBCPP_INLINE_VISIBILITY pointer operator->() const _NOEXCEPT {return __ptr_.first();}
+    _LIBCPP_INLINE_VISIBILITY pointer get() const _NOEXCEPT {return __ptr_.first();}
+    _LIBCPP_INLINE_VISIBILITY       _Dp_reference get_deleter() _NOEXCEPT
+        {return __ptr_.second();}
+    _LIBCPP_INLINE_VISIBILITY _Dp_const_reference get_deleter() const _NOEXCEPT
+        {return __ptr_.second();}
+    _LIBCPP_INLINE_VISIBILITY operator int __nat::*() const
+             _NOEXCEPT
+        {return __ptr_.first() ? &__nat::__for_bool_ : 0;}
 
-    _LIBCPP_INLINE_VISIBILITY pointer release()
+    _LIBCPP_INLINE_VISIBILITY pointer release() _NOEXCEPT
     {
         pointer __t = __ptr_.first();
         __ptr_.first() = pointer();
         return __t;
     }
 
-    _LIBCPP_INLINE_VISIBILITY void reset(pointer __p = pointer())
+    _LIBCPP_INLINE_VISIBILITY void reset(pointer __p = pointer()) _NOEXCEPT
     {
         pointer __tmp = __ptr_.first();
         __ptr_.first() = __p;
@@ -2158,7 +2261,8 @@
             __ptr_.second()(__tmp);
     }
 
-    _LIBCPP_INLINE_VISIBILITY void swap(unique_ptr& __u) {__ptr_.swap(__u.__ptr_);}
+    _LIBCPP_INLINE_VISIBILITY void swap(unique_ptr& __u) _NOEXCEPT
+        {__ptr_.swap(__u.__ptr_);}
 };
 
 template <class _Tp, class _Dp>
@@ -2188,13 +2292,13 @@
     typedef       typename remove_reference<deleter_type>::type& _Dp_reference;
     typedef const typename remove_reference<deleter_type>::type& _Dp_const_reference;
 public:
-    _LIBCPP_INLINE_VISIBILITY unique_ptr()
+    _LIBCPP_INLINE_VISIBILITY unique_ptr() _NOEXCEPT
         : __ptr_(pointer())
         {
             static_assert(!is_pointer<deleter_type>::value,
                 "unique_ptr constructed with null function pointer deleter");
         }
-    _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t)
+    _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t) _NOEXCEPT
         : __ptr_(pointer())
         {
             static_assert(!is_pointer<deleter_type>::value,
@@ -2204,7 +2308,7 @@
     template <class _P,
               class = typename enable_if<is_same<_P, pointer>::value>::type
              >
-    _LIBCPP_INLINE_VISIBILITY explicit unique_ptr(_P __p)
+    _LIBCPP_INLINE_VISIBILITY explicit unique_ptr(_P __p) _NOEXCEPT
         : __ptr_(__p)
         {
             static_assert(!is_pointer<deleter_type>::value,
@@ -2218,12 +2322,14 @@
                                        is_reference<deleter_type>::value,
                                        deleter_type,
                                        typename add_lvalue_reference<const deleter_type>::type>::type __d)
+             _NOEXCEPT
         : __ptr_(__p, __d) {}
 
     _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t, typename conditional<
                                        is_reference<deleter_type>::value,
                                        deleter_type,
                                        typename add_lvalue_reference<const deleter_type>::type>::type __d)
+             _NOEXCEPT
         : __ptr_(pointer(), __d) {}
 
     template <class _P,
@@ -2231,21 +2337,23 @@
                                          is_same<_P, nullptr_t>::value>::type
              >
     _LIBCPP_INLINE_VISIBILITY unique_ptr(_P __p, typename remove_reference<deleter_type>::type&& __d)
+             _NOEXCEPT
         : __ptr_(__p, _STD::move(__d))
         {
             static_assert(!is_reference<deleter_type>::value, "rvalue deleter bound to reference");
         }
 
     _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t, typename remove_reference<deleter_type>::type&& __d)
+             _NOEXCEPT
         : __ptr_(pointer(), _STD::move(__d))
         {
             static_assert(!is_reference<deleter_type>::value, "rvalue deleter bound to reference");
         }
 
-    _LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u)
+    _LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u) _NOEXCEPT
         : __ptr_(__u.release(), _STD::forward<deleter_type>(__u.get_deleter())) {}
 
-    _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(unique_ptr&& __u)
+    _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(unique_ptr&& __u) _NOEXCEPT
         {
             reset(__u.release());
             __ptr_.second() = _STD::forward<deleter_type>(__u.get_deleter());
@@ -2284,7 +2392,7 @@
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
     _LIBCPP_INLINE_VISIBILITY ~unique_ptr() {reset();}
 
-    _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(nullptr_t)
+    _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(nullptr_t) _NOEXCEPT
     {
         reset();
         return *this;
@@ -2292,12 +2400,15 @@
 
     _LIBCPP_INLINE_VISIBILITY typename add_lvalue_reference<_Tp>::type operator[](size_t __i) const
         {return __ptr_.first()[__i];}
-    _LIBCPP_INLINE_VISIBILITY pointer get() const {return __ptr_.first();}
-    _LIBCPP_INLINE_VISIBILITY       _Dp_reference get_deleter()       {return __ptr_.second();}
-    _LIBCPP_INLINE_VISIBILITY _Dp_const_reference get_deleter() const {return __ptr_.second();}
-    _LIBCPP_INLINE_VISIBILITY operator int __nat::*() const {return __ptr_.first() ? &__nat::__for_bool_ : 0;}
+    _LIBCPP_INLINE_VISIBILITY pointer get() const _NOEXCEPT {return __ptr_.first();}
+    _LIBCPP_INLINE_VISIBILITY       _Dp_reference get_deleter() _NOEXCEPT
+        {return __ptr_.second();}
+    _LIBCPP_INLINE_VISIBILITY _Dp_const_reference get_deleter() const _NOEXCEPT
+        {return __ptr_.second();}
+    _LIBCPP_INLINE_VISIBILITY operator int __nat::*() const _NOEXCEPT
+        {return __ptr_.first() ? &__nat::__for_bool_ : 0;}
 
-    _LIBCPP_INLINE_VISIBILITY pointer release()
+    _LIBCPP_INLINE_VISIBILITY pointer release() _NOEXCEPT
     {
         pointer __t = __ptr_.first();
         __ptr_.first() = pointer();
@@ -2308,21 +2419,21 @@
     template <class _P,
               class = typename enable_if<is_same<_P, pointer>::value>::type
              >
-    _LIBCPP_INLINE_VISIBILITY void reset(_P __p)
+    _LIBCPP_INLINE_VISIBILITY void reset(_P __p) _NOEXCEPT
     {
         pointer __tmp = __ptr_.first();
         __ptr_.first() = __p;
         if (__tmp)
             __ptr_.second()(__tmp);
     }
-    _LIBCPP_INLINE_VISIBILITY void reset(nullptr_t)
+    _LIBCPP_INLINE_VISIBILITY void reset(nullptr_t) _NOEXCEPT
     {
         pointer __tmp = __ptr_.first();
         __ptr_.first() = nullptr;
         if (__tmp)
             __ptr_.second()(__tmp);
     }
-    _LIBCPP_INLINE_VISIBILITY void reset()
+    _LIBCPP_INLINE_VISIBILITY void reset() _NOEXCEPT
     {
         pointer __tmp = __ptr_.first();
         __ptr_.first() = nullptr;
@@ -2362,7 +2473,7 @@
 template <class _Tp, class _Dp>
 inline _LIBCPP_INLINE_VISIBILITY
 void
-swap(unique_ptr<_Tp, _Dp>& __x, unique_ptr<_Tp, _Dp>& __y) {__x.swap(__y);}
+swap(unique_ptr<_Tp, _Dp>& __x, unique_ptr<_Tp, _Dp>& __y) _NOEXCEPT {__x.swap(__y);}
 
 template <class _T1, class _D1, class _T2, class _D2>
 inline _LIBCPP_INLINE_VISIBILITY
@@ -2401,7 +2512,7 @@
     : public unary_function<_Tp*, size_t>
 {
     _LIBCPP_INLINE_VISIBILITY
-    size_t operator()(_Tp* __v) const
+    size_t operator()(_Tp* __v) const _NOEXCEPT
     {
         const size_t* const __p = reinterpret_cast<const size_t*>(&__v);
         return *__p;
@@ -2414,7 +2525,7 @@
     typedef unique_ptr<_Tp, _Dp> argument_type;
     typedef size_t               result_type;
     _LIBCPP_INLINE_VISIBILITY
-    result_type operator()(const argument_type& __ptr) const
+    result_type operator()(const argument_type& __ptr) const _NOEXCEPT
     {
         typedef typename argument_type::pointer pointer;
         return hash<pointer>()(__ptr.get());
@@ -2427,35 +2538,36 @@
     size_t size;
 
     template <class _Tp>
-    _LIBCPP_INLINE_VISIBILITY void __process(_Tp* __p, false_type)
+    _LIBCPP_INLINE_VISIBILITY void __process(_Tp* __p, false_type) _NOEXCEPT
         {for (size_t __i = 0; __i < size; ++__i, ++__p) __p->~_Tp();}
 
     template <class _Tp>
-    _LIBCPP_INLINE_VISIBILITY void __process(_Tp*, true_type)
+    _LIBCPP_INLINE_VISIBILITY void __process(_Tp*, true_type) _NOEXCEPT
         {}
 
-    _LIBCPP_INLINE_VISIBILITY void __incr(false_type)
+    _LIBCPP_INLINE_VISIBILITY void __incr(false_type) _NOEXCEPT
         {++size;}
-    _LIBCPP_INLINE_VISIBILITY void __incr(true_type)
+    _LIBCPP_INLINE_VISIBILITY void __incr(true_type) _NOEXCEPT
         {}
 
-    _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, false_type)
+    _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, false_type) _NOEXCEPT
         {size = __s;}
-    _LIBCPP_INLINE_VISIBILITY void __set(size_t, true_type)
+    _LIBCPP_INLINE_VISIBILITY void __set(size_t, true_type) _NOEXCEPT
         {}
 public:
-    _LIBCPP_INLINE_VISIBILITY explicit __destruct_n(size_t __s) : size(__s) {}
+    _LIBCPP_INLINE_VISIBILITY explicit __destruct_n(size_t __s) _NOEXCEPT
+        : size(__s) {}
 
     template <class _Tp>
-    _LIBCPP_INLINE_VISIBILITY void __incr(_Tp*)
+    _LIBCPP_INLINE_VISIBILITY void __incr(_Tp*) _NOEXCEPT
         {__incr(integral_constant<bool, is_trivially_destructible<_Tp>::value>());}
 
     template <class _Tp>
-    _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, _Tp*)
+    _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, _Tp*) _NOEXCEPT
         {__set(__s, integral_constant<bool, is_trivially_destructible<_Tp>::value>());}
 
     template <class _Tp>
-    _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p)
+    _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) _NOEXCEPT
         {__process(__p, integral_constant<bool, is_trivially_destructible<_Tp>::value>());}
 };
 
@@ -2471,9 +2583,11 @@
     size_type __s_;
 public:
     _LIBCPP_INLINE_VISIBILITY __allocator_destructor(_Alloc& __a, size_type __s)
+             _NOEXCEPT
         : __alloc_(__a), __s_(__s) {}
     _LIBCPP_INLINE_VISIBILITY
-    void operator()(pointer __p) {__alloc_traits::deallocate(__alloc_, __p, __s_);}
+    void operator()(pointer __p) _NOEXCEPT
+        {__alloc_traits::deallocate(__alloc_, __p, __s_);}
 };
 
 template <class _InputIterator, class _ForwardIterator>
@@ -2531,8 +2645,8 @@
     : public std::exception
 {
 public:
-    virtual ~bad_weak_ptr() throw();
-    virtual const char* what() const throw();
+    virtual ~bad_weak_ptr() _NOEXCEPT;
+    virtual const char* what() const  _NOEXCEPT;
 };
 
 template<class _Tp> class weak_ptr;
@@ -2546,17 +2660,17 @@
     long __shared_owners_;
     virtual ~__shared_count();
 private:
-    virtual void __on_zero_shared() = 0;
+    virtual void __on_zero_shared() _NOEXCEPT = 0;
 
 public:
     _LIBCPP_INLINE_VISIBILITY
-    explicit __shared_count(long __refs = 0)
+    explicit __shared_count(long __refs = 0) _NOEXCEPT
         : __shared_owners_(__refs) {}
 
-    void __add_shared();
-    bool __release_shared();
+    void __add_shared() _NOEXCEPT;
+    bool __release_shared() _NOEXCEPT;
     _LIBCPP_INLINE_VISIBILITY
-    long use_count() const {return __shared_owners_ + 1;}
+    long use_count() const _NOEXCEPT {return __shared_owners_ + 1;}
 };
 
 class __shared_weak_count
@@ -2566,26 +2680,26 @@
 
 public:
     _LIBCPP_INLINE_VISIBILITY
-    explicit __shared_weak_count(long __refs = 0)
+    explicit __shared_weak_count(long __refs = 0) _NOEXCEPT
         : __shared_count(__refs),
           __shared_weak_owners_(__refs) {}
 protected:
     virtual ~__shared_weak_count();
 
 public:
-    void __add_shared();
-    void __add_weak();
-    void __release_shared();
-    void __release_weak();
+    void __add_shared() _NOEXCEPT;
+    void __add_weak() _NOEXCEPT;
+    void __release_shared() _NOEXCEPT;
+    void __release_weak() _NOEXCEPT;
     _LIBCPP_INLINE_VISIBILITY
-    long use_count() const {return __shared_count::use_count();}
-    __shared_weak_count* lock();
+    long use_count() const _NOEXCEPT {return __shared_count::use_count();}
+    __shared_weak_count* lock() _NOEXCEPT;
 
 #ifndef _LIBCPP_NO_RTTI
-    virtual const void* __get_deleter(const type_info&) const;
+    virtual const void* __get_deleter(const type_info&) const _NOEXCEPT;
 #endif
 private:
-    virtual void __on_zero_shared_weak() = 0;
+    virtual void __on_zero_shared_weak() _NOEXCEPT = 0;
 };
 
 template <class _Tp, class _Dp, class _Alloc>
@@ -2599,19 +2713,19 @@
         :  __data_(__compressed_pair<_Tp, _Dp>(__p, _STD::move(__d)), _STD::move(__a)) {}
 
 #ifndef _LIBCPP_NO_RTTI
-    virtual const void* __get_deleter(const type_info&) const;
+    virtual const void* __get_deleter(const type_info&) const _NOEXCEPT;
 #endif
 
 private:
-    virtual void __on_zero_shared();
-    virtual void __on_zero_shared_weak();
+    virtual void __on_zero_shared() _NOEXCEPT;
+    virtual void __on_zero_shared_weak() _NOEXCEPT;
 };
 
 #ifndef _LIBCPP_NO_RTTI
 
 template <class _Tp, class _Dp, class _Alloc>
 const void*
-__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__get_deleter(const type_info& __t) const
+__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__get_deleter(const type_info& __t) const _NOEXCEPT
 {
     return __t == typeid(_Dp) ? &__data_.first().second() : 0;
 }
@@ -2620,7 +2734,7 @@
 
 template <class _Tp, class _Dp, class _Alloc>
 void
-__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared()
+__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared() _NOEXCEPT
 {
     __data_.first().second()(__data_.first().first());
     __data_.first().second().~_Dp();
@@ -2628,7 +2742,7 @@
 
 template <class _Tp, class _Dp, class _Alloc>
 void
-__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared_weak()
+__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT
 {
     typename _Alloc::template rebind<__shared_ptr_pointer>::other __a(__data_.second());
     __data_.second().~_Alloc();
@@ -2676,23 +2790,23 @@
 #endif  // _LIBCPP_HAS_NO_VARIADICS
 
 private:
-    virtual void __on_zero_shared();
-    virtual void __on_zero_shared_weak();
+    virtual void __on_zero_shared() _NOEXCEPT;
+    virtual void __on_zero_shared_weak() _NOEXCEPT;
 public:
     _LIBCPP_INLINE_VISIBILITY
-    _Tp* get() {return &__data_.second();}
+    _Tp* get() _NOEXCEPT {return &__data_.second();}
 };
 
 template <class _Tp, class _Alloc>
 void
-__shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared()
+__shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared() _NOEXCEPT
 {
     __data_.second().~_Tp();
 }
 
 template <class _Tp, class _Alloc>
 void
-__shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared_weak()
+__shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT
 {
     typename _Alloc::template rebind<__shared_ptr_emplace>::other __a(__data_.first());
     __data_.first().~_Alloc();
@@ -2712,22 +2826,24 @@
 
     struct __nat {int __for_bool_;};
 public:
-    shared_ptr();
-    shared_ptr(nullptr_t);
+    shared_ptr() _NOEXCEPT;
+    shared_ptr(nullptr_t) _NOEXCEPT;
     template<class _Yp> explicit shared_ptr(_Yp* __p);
     template<class _Yp, class _Dp> shared_ptr(_Yp* __p, _Dp __d);
     template<class _Yp, class _Dp, class _Alloc> shared_ptr(_Yp* __p, _Dp __d, _Alloc __a);
     template <class _Dp> shared_ptr(nullptr_t __p, _Dp __d);
     template <class _Dp, class _Alloc> shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a);
-    template<class _Yp> shared_ptr(const shared_ptr<_Yp>& __r, element_type *__p);
-    shared_ptr(const shared_ptr& __r);
+    template<class _Yp> shared_ptr(const shared_ptr<_Yp>& __r, element_type* __p) _NOEXCEPT;
+    shared_ptr(const shared_ptr& __r) _NOEXCEPT;
     template<class _Yp>
         shared_ptr(const shared_ptr<_Yp>& __r,
-                   typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type = __nat());
+                   typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type = __nat())
+                       _NOEXCEPT;
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-    shared_ptr(shared_ptr&& __r);
+    shared_ptr(shared_ptr&& __r) _NOEXCEPT;
     template<class _Yp> shared_ptr(shared_ptr<_Yp>&& __r,
-                   typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type = __nat());
+                   typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type = __nat())
+                       _NOEXCEPT;
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
     template<class _Yp> explicit shared_ptr(const weak_ptr<_Yp>& __r,
                    typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type= __nat());
@@ -2753,10 +2869,10 @@
 
     ~shared_ptr();
 
-    shared_ptr& operator=(const shared_ptr& __r);
-    template<class _Yp> shared_ptr& operator=(const shared_ptr<_Yp>& __r);
+    shared_ptr& operator=(const shared_ptr& __r) _NOEXCEPT;
+    template<class _Yp> shared_ptr& operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT;
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-    shared_ptr& operator=(shared_ptr&& __r);
+    shared_ptr& operator=(shared_ptr&& __r) _NOEXCEPT;
     template<class _Yp> shared_ptr& operator=(shared_ptr<_Yp>&& __r);
     template<class _Yp> shared_ptr& operator=(auto_ptr<_Yp>&& __r);
 #else  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
@@ -2771,26 +2887,25 @@
     template <class _Yp, class _Dp> shared_ptr& operator=(unique_ptr<_Yp, _Dp> __r);
 #endif
 
-    void swap(shared_ptr& __r);
-    void reset();
-    template<class _Yp> void reset(_Yp* __p);
+    void swap(shared_ptr& __r) _NOEXCEPT;
+    void reset() _NOEXCEPT;
+    template<class _Yp> void reset(_Yp* __p) _NOEXCEPT;
     template<class _Yp, class _Dp> void reset(_Yp* __p, _Dp __d);
     template<class _Yp, class _Dp, class _Alloc> void reset(_Yp* __p, _Dp __d, _Alloc __a);
 
     _LIBCPP_INLINE_VISIBILITY
-    element_type* get() const {return __ptr_;}
+    element_type* get() const _NOEXCEPT {return __ptr_;}
     _LIBCPP_INLINE_VISIBILITY
-    typename add_lvalue_reference<element_type>::type operator*() const {return *__ptr_;}
-    _LIBCPP_INLINE_VISIBILITY
-    element_type* operator->() const {return __ptr_;}
+    typename add_lvalue_reference<element_type>::type operator*() const _NOEXCEPT
+        {return *__ptr_;}
     _LIBCPP_INLINE_VISIBILITY
-    long use_count() const {return __cntrl_ ? __cntrl_->use_count() : 0;}
+    element_type* operator->() const _NOEXCEPT {return __ptr_;}
     _LIBCPP_INLINE_VISIBILITY
-    bool unique() const {return use_count() == 1;}
+    long use_count() const _NOEXCEPT {return __cntrl_ ? __cntrl_->use_count() : 0;}
     _LIBCPP_INLINE_VISIBILITY
-    bool empty() const {return __cntrl_ == 0;}
+    bool unique() const _NOEXCEPT {return use_count() == 1;}
     _LIBCPP_INLINE_VISIBILITY
-    /*explicit*/ operator bool() const {return get() != 0;}
+    /*explicit*/ operator bool() const _NOEXCEPT {return get() != 0;}
     template <class _U>
         _LIBCPP_INLINE_VISIBILITY
         bool owner_before(shared_ptr<_U> const& __p) const
@@ -2803,7 +2918,7 @@
 #ifndef _LIBCPP_NO_RTTI
     template <class _Dp>
         _LIBCPP_INLINE_VISIBILITY
-        _Dp* __get_deleter() const
+        _Dp* __get_deleter() const _NOEXCEPT
             {return (_Dp*)(__cntrl_ ? __cntrl_->__get_deleter(typeid(_Dp)) : 0);}
 #endif  // _LIBCPP_NO_RTTI
 
@@ -2855,14 +2970,14 @@
     template <class _Yp>
         _LIBCPP_INLINE_VISIBILITY
         void
-        __enable_weak_this(const enable_shared_from_this<_Yp>* __e)
+        __enable_weak_this(const enable_shared_from_this<_Yp>* __e) _NOEXCEPT
         {
             if (__e)
                 __e->__weak_this_ = *this;
         }
 
     _LIBCPP_INLINE_VISIBILITY
-    void __enable_weak_this(const void*) {}
+    void __enable_weak_this(const void*) _NOEXCEPT {}
 
     template <class _Up> friend class _LIBCPP_VISIBLE shared_ptr;
     template <class _Up> friend class _LIBCPP_VISIBLE weak_ptr;
@@ -2870,7 +2985,7 @@
 
 template<class _Tp>
 inline _LIBCPP_INLINE_VISIBILITY
-shared_ptr<_Tp>::shared_ptr()
+shared_ptr<_Tp>::shared_ptr() _NOEXCEPT
     : __ptr_(0),
       __cntrl_(0)
 {
@@ -2878,7 +2993,7 @@
 
 template<class _Tp>
 inline _LIBCPP_INLINE_VISIBILITY
-shared_ptr<_Tp>::shared_ptr(nullptr_t)
+shared_ptr<_Tp>::shared_ptr(nullptr_t) _NOEXCEPT
     : __ptr_(0),
       __cntrl_(0)
 {
@@ -2995,7 +3110,7 @@
 template<class _Tp>
 template<class _Yp>
 inline _LIBCPP_INLINE_VISIBILITY
-shared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r, element_type *__p)
+shared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r, element_type *__p) _NOEXCEPT
     : __ptr_(__p),
       __cntrl_(__r.__cntrl_)
 {
@@ -3005,7 +3120,7 @@
 
 template<class _Tp>
 inline _LIBCPP_INLINE_VISIBILITY
-shared_ptr<_Tp>::shared_ptr(const shared_ptr& __r)
+shared_ptr<_Tp>::shared_ptr(const shared_ptr& __r) _NOEXCEPT
     : __ptr_(__r.__ptr_),
       __cntrl_(__r.__cntrl_)
 {
@@ -3018,6 +3133,7 @@
 inline _LIBCPP_INLINE_VISIBILITY
 shared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r,
                             typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type)
+         _NOEXCEPT
     : __ptr_(__r.__ptr_),
       __cntrl_(__r.__cntrl_)
 {
@@ -3029,7 +3145,7 @@
 
 template<class _Tp>
 inline _LIBCPP_INLINE_VISIBILITY
-shared_ptr<_Tp>::shared_ptr(shared_ptr&& __r)
+shared_ptr<_Tp>::shared_ptr(shared_ptr&& __r) _NOEXCEPT
     : __ptr_(__r.__ptr_),
       __cntrl_(__r.__cntrl_)
 {
@@ -3042,6 +3158,7 @@
 inline _LIBCPP_INLINE_VISIBILITY
 shared_ptr<_Tp>::shared_ptr(shared_ptr<_Yp>&& __r,
                             typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type)
+         _NOEXCEPT
     : __ptr_(__r.__ptr_),
       __cntrl_(__r.__cntrl_)
 {
@@ -3295,7 +3412,7 @@
 template<class _Tp>
 inline _LIBCPP_INLINE_VISIBILITY
 shared_ptr<_Tp>&
-shared_ptr<_Tp>::operator=(const shared_ptr& __r)
+shared_ptr<_Tp>::operator=(const shared_ptr& __r) _NOEXCEPT
 {
     shared_ptr(__r).swap(*this);
     return *this;
@@ -3305,7 +3422,7 @@
 template<class _Yp>
 inline _LIBCPP_INLINE_VISIBILITY
 shared_ptr<_Tp>&
-shared_ptr<_Tp>::operator=(const shared_ptr<_Yp>& __r)
+shared_ptr<_Tp>::operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT
 {
     shared_ptr(__r).swap(*this);
     return *this;
@@ -3316,7 +3433,7 @@
 template<class _Tp>
 inline _LIBCPP_INLINE_VISIBILITY
 shared_ptr<_Tp>&
-shared_ptr<_Tp>::operator=(shared_ptr&& __r)
+shared_ptr<_Tp>::operator=(shared_ptr&& __r) _NOEXCEPT
 {
     shared_ptr(_STD::move(__r)).swap(*this);
     return *this;
@@ -3379,7 +3496,7 @@
 template<class _Tp>
 inline _LIBCPP_INLINE_VISIBILITY
 void
-shared_ptr<_Tp>::swap(shared_ptr& __r)
+shared_ptr<_Tp>::swap(shared_ptr& __r) _NOEXCEPT
 {
     _STD::swap(__ptr_, __r.__ptr_);
     _STD::swap(__cntrl_, __r.__cntrl_);
@@ -3388,7 +3505,7 @@
 template<class _Tp>
 inline _LIBCPP_INLINE_VISIBILITY
 void
-shared_ptr<_Tp>::reset()
+shared_ptr<_Tp>::reset() _NOEXCEPT
 {
     shared_ptr().swap(*this);
 }
@@ -3509,7 +3626,7 @@
 template<class _Tp, class _Up>
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-operator==(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y)
+operator==(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT
 {
     return __x.get() == __y.get();
 }
@@ -3517,7 +3634,7 @@
 template<class _Tp, class _Up>
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-operator!=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y)
+operator!=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT
 {
     return !(__x == __y);
 }
@@ -3525,7 +3642,7 @@
 template<class _Tp, class _Up>
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-operator<(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y)
+operator<(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT
 {
     return __x.get() < __y.get();
 }
@@ -3533,7 +3650,7 @@
 template<class _Tp>
 inline _LIBCPP_INLINE_VISIBILITY
 void
-swap(shared_ptr<_Tp>& __x, shared_ptr<_Tp>& __y)
+swap(shared_ptr<_Tp>& __x, shared_ptr<_Tp>& __y) _NOEXCEPT
 {
     __x.swap(__y);
 }
@@ -3541,7 +3658,7 @@
 template<class _Tp, class _Up>
 inline _LIBCPP_INLINE_VISIBILITY
 shared_ptr<_Tp>
-static_pointer_cast(const shared_ptr<_Up>& __r)
+static_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT
 {
     return shared_ptr<_Tp>(__r, static_cast<_Tp*>(__r.get()));
 }
@@ -3549,7 +3666,7 @@
 template<class _Tp, class _Up>
 inline _LIBCPP_INLINE_VISIBILITY
 shared_ptr<_Tp>
-dynamic_pointer_cast(const shared_ptr<_Up>& __r)
+dynamic_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT
 {
     _Tp* __p = dynamic_cast<_Tp*>(__r.get());
     return __p ? shared_ptr<_Tp>(__r, __p) : shared_ptr<_Tp>();
@@ -3557,7 +3674,7 @@
 
 template<class _Tp, class _Up>
 shared_ptr<_Tp>
-const_pointer_cast(const shared_ptr<_Up>& __r)
+const_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT
 {
     return shared_ptr<_Tp>(__r, const_cast<_Tp*>(__r.get()));
 }
@@ -3567,7 +3684,7 @@
 template<class _Dp, class _Tp>
 inline _LIBCPP_INLINE_VISIBILITY
 _Dp*
-get_deleter(const shared_ptr<_Tp>& __p)
+get_deleter(const shared_ptr<_Tp>& __p) _NOEXCEPT
 {
     return __p.template __get_deleter<_Dp>();
 }
@@ -3584,27 +3701,31 @@
     __shared_weak_count* __cntrl_;
 
 public:
-    weak_ptr();
+    weak_ptr() _NOEXCEPT;
     template<class _Yp> weak_ptr(shared_ptr<_Yp> const& __r,
-                   typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0);
-    weak_ptr(weak_ptr const& __r);
+                   typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0)
+                        _NOEXCEPT;
+    weak_ptr(weak_ptr const& __r) _NOEXCEPT;
     template<class _Yp> weak_ptr(weak_ptr<_Yp> const& __r,
-                   typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0);
+                   typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0)
+                         _NOEXCEPT;
 
     ~weak_ptr();
 
-    weak_ptr& operator=(weak_ptr const& __r);
-    template<class _Yp> weak_ptr& operator=(weak_ptr<_Yp> const& __r);
-    template<class _Yp> weak_ptr& operator=(shared_ptr<_Yp> const& __r);
+    weak_ptr& operator=(weak_ptr const& __r) _NOEXCEPT;
+    template<class _Yp> weak_ptr& operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT;
+    template<class _Yp> weak_ptr& operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT;
 
-    void swap(weak_ptr& __r);
-    void reset();
+    void swap(weak_ptr& __r) _NOEXCEPT;
+    void reset() _NOEXCEPT;
 
     _LIBCPP_INLINE_VISIBILITY
-    long use_count() const {return __cntrl_ ? __cntrl_->use_count() : 0;}
+    long use_count() const _NOEXCEPT
+        {return __cntrl_ ? __cntrl_->use_count() : 0;}
     _LIBCPP_INLINE_VISIBILITY
-    bool expired() const {return __cntrl_ == 0 || __cntrl_->use_count() == 0;}
-    shared_ptr<_Tp> lock() const;
+    bool expired() const _NOEXCEPT
+        {return __cntrl_ == 0 || __cntrl_->use_count() == 0;}
+    shared_ptr<_Tp> lock() const _NOEXCEPT;
     template<class _Up>
         _LIBCPP_INLINE_VISIBILITY
         bool owner_before(const shared_ptr<_Up>& __r) const
@@ -3620,7 +3741,7 @@
 
 template<class _Tp>
 inline _LIBCPP_INLINE_VISIBILITY
-weak_ptr<_Tp>::weak_ptr()
+weak_ptr<_Tp>::weak_ptr() _NOEXCEPT
     : __ptr_(0),
       __cntrl_(0)
 {
@@ -3628,7 +3749,7 @@
 
 template<class _Tp>
 inline _LIBCPP_INLINE_VISIBILITY
-weak_ptr<_Tp>::weak_ptr(weak_ptr const& __r)
+weak_ptr<_Tp>::weak_ptr(weak_ptr const& __r) _NOEXCEPT
     : __ptr_(__r.__ptr_),
       __cntrl_(__r.__cntrl_)
 {
@@ -3641,6 +3762,7 @@
 inline _LIBCPP_INLINE_VISIBILITY
 weak_ptr<_Tp>::weak_ptr(shared_ptr<_Yp> const& __r,
                         typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type)
+                         _NOEXCEPT
     : __ptr_(__r.__ptr_),
       __cntrl_(__r.__cntrl_)
 {
@@ -3653,6 +3775,7 @@
 inline _LIBCPP_INLINE_VISIBILITY
 weak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp> const& __r,
                         typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type)
+         _NOEXCEPT
     : __ptr_(__r.__ptr_),
       __cntrl_(__r.__cntrl_)
 {
@@ -3670,7 +3793,7 @@
 template<class _Tp>
 inline _LIBCPP_INLINE_VISIBILITY
 weak_ptr<_Tp>&
-weak_ptr<_Tp>::operator=(weak_ptr const& __r)
+weak_ptr<_Tp>::operator=(weak_ptr const& __r) _NOEXCEPT
 {
     weak_ptr(__r).swap(*this);
     return *this;
@@ -3680,7 +3803,7 @@
 template<class _Yp>
 inline _LIBCPP_INLINE_VISIBILITY
 weak_ptr<_Tp>&
-weak_ptr<_Tp>::operator=(weak_ptr<_Yp> const& __r)
+weak_ptr<_Tp>::operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT
 {
     weak_ptr(__r).swap(*this);
     return *this;
@@ -3690,7 +3813,7 @@
 template<class _Yp>
 inline _LIBCPP_INLINE_VISIBILITY
 weak_ptr<_Tp>&
-weak_ptr<_Tp>::operator=(shared_ptr<_Yp> const& __r)
+weak_ptr<_Tp>::operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT
 {
     weak_ptr(__r).swap(*this);
     return *this;
@@ -3699,7 +3822,7 @@
 template<class _Tp>
 inline _LIBCPP_INLINE_VISIBILITY
 void
-weak_ptr<_Tp>::swap(weak_ptr& __r)
+weak_ptr<_Tp>::swap(weak_ptr& __r) _NOEXCEPT
 {
     _STD::swap(__ptr_, __r.__ptr_);
     _STD::swap(__cntrl_, __r.__cntrl_);
@@ -3708,7 +3831,7 @@
 template<class _Tp>
 inline _LIBCPP_INLINE_VISIBILITY
 void
-swap(weak_ptr<_Tp>& __x, weak_ptr<_Tp>& __y)
+swap(weak_ptr<_Tp>& __x, weak_ptr<_Tp>& __y) _NOEXCEPT
 {
     __x.swap(__y);
 }
@@ -3716,7 +3839,7 @@
 template<class _Tp>
 inline _LIBCPP_INLINE_VISIBILITY
 void
-weak_ptr<_Tp>::reset()
+weak_ptr<_Tp>::reset() _NOEXCEPT
 {
     weak_ptr().swap(*this);
 }
@@ -3738,7 +3861,7 @@
 
 template<class _Tp>
 shared_ptr<_Tp>
-weak_ptr<_Tp>::lock() const
+weak_ptr<_Tp>::lock() const _NOEXCEPT
 {
     shared_ptr<_Tp> __r;
     __r.__cntrl_ = __cntrl_ ? __cntrl_->lock() : __cntrl_;
@@ -3787,18 +3910,21 @@
     mutable weak_ptr<_Tp> __weak_this_;
 protected:
     _LIBCPP_INLINE_VISIBILITY
-    enable_shared_from_this() {}
+    enable_shared_from_this() _NOEXCEPT {}
     _LIBCPP_INLINE_VISIBILITY
-    enable_shared_from_this(enable_shared_from_this const&) {}
+    enable_shared_from_this(enable_shared_from_this const&) _NOEXCEPT {}
     _LIBCPP_INLINE_VISIBILITY
-    enable_shared_from_this& operator=(enable_shared_from_this const&) {return *this;}
+    enable_shared_from_this& operator=(enable_shared_from_this const&) _NOEXCEPT
+        {return *this;}
     _LIBCPP_INLINE_VISIBILITY
     ~enable_shared_from_this() {}
 public:
     _LIBCPP_INLINE_VISIBILITY
-    shared_ptr<_Tp> shared_from_this() {return shared_ptr<_Tp>(__weak_this_);}
+    shared_ptr<_Tp> shared_from_this()
+        {return shared_ptr<_Tp>(__weak_this_);}
     _LIBCPP_INLINE_VISIBILITY
-    shared_ptr<_Tp const> shared_from_this() const {return shared_ptr<const _Tp>(__weak_this_);}
+    shared_ptr<_Tp const> shared_from_this() const
+        {return shared_ptr<const _Tp>(__weak_this_);}
 
     template <class _Up> friend class shared_ptr;
 };
@@ -3809,7 +3935,7 @@
     typedef shared_ptr<_Tp>      argument_type;
     typedef size_t               result_type;
     _LIBCPP_INLINE_VISIBILITY
-    result_type operator()(const argument_type& __ptr) const
+    result_type operator()(const argument_type& __ptr) const _NOEXCEPT
     {
         return hash<_Tp*>()(__ptr.get());
     }
@@ -3836,7 +3962,7 @@
 void declare_reachable(void* __p);
 void declare_no_pointers(char* __p, size_t __n);
 void undeclare_no_pointers(char* __p, size_t __n);
-pointer_safety get_pointer_safety();
+pointer_safety get_pointer_safety() _NOEXCEPT;
 void* __undeclare_reachable(void*);
 
 template <class _Tp>

Modified: libcxx/trunk/include/type_traits
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/type_traits?rev=132261&r1=132260&r2=132261&view=diff
==============================================================================
--- libcxx/trunk/include/type_traits (original)
+++ libcxx/trunk/include/type_traits Sat May 28 09:41:13 2011
@@ -2999,7 +2999,11 @@
 
 template <class _Tp>
 inline _LIBCPP_INLINE_VISIBILITY
-void
+typename enable_if
+<
+    is_move_constructible<_Tp>::value &&
+    is_move_assignable<_Tp>::value
+>::type
 swap(_Tp& __x, _Tp& __y) _NOEXCEPT_(is_nothrow_move_constructible<_Tp>::value &&
                                     is_nothrow_move_assignable<_Tp>::value)
 {
@@ -3021,6 +3025,10 @@
 
 // __swappable
 
+namespace __detail
+{
+
+using _STD::swap;
 __nat swap(__any, __any);
 
 template <class _Tp>
@@ -3030,9 +3038,11 @@
     static const bool value = !is_same<type, __nat>::value;
 };
 
+}  // __detail
+
 template <class _Tp>
 struct __is_swappable
-    : public integral_constant<bool, __swappable<_Tp>::value>
+    : public integral_constant<bool, __detail::__swappable<_Tp>::value>
 {
 };
 

Modified: libcxx/trunk/src/future.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/future.cpp?rev=132261&r1=132260&r2=132261&view=diff
==============================================================================
--- libcxx/trunk/src/future.cpp (original)
+++ libcxx/trunk/src/future.cpp Sat May 28 09:41:13 2011
@@ -60,7 +60,7 @@
 }
 
 void
-__assoc_sub_state::__on_zero_shared()
+__assoc_sub_state::__on_zero_shared() _NOEXCEPT
 {
     delete this;
 }

Modified: libcxx/trunk/src/locale.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/locale.cpp?rev=132261&r1=132260&r2=132261&view=diff
==============================================================================
--- libcxx/trunk/src/locale.cpp (original)
+++ libcxx/trunk/src/locale.cpp Sat May 28 09:41:13 2011
@@ -518,7 +518,7 @@
 }
 
 void
-locale::facet::__on_zero_shared()
+locale::facet::__on_zero_shared() _NOEXCEPT
 {
     delete this;
 }

Modified: libcxx/trunk/src/memory.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/memory.cpp?rev=132261&r1=132260&r2=132261&view=diff
==============================================================================
--- libcxx/trunk/src/memory.cpp (original)
+++ libcxx/trunk/src/memory.cpp Sat May 28 09:41:13 2011
@@ -16,14 +16,14 @@
 
 template <class T>
 inline T
-increment(T& t)
+increment(T& t) _NOEXCEPT
 {
     return __sync_add_and_fetch(&t, 1);
 }
 
 template <class T>
 inline T
-decrement(T& t)
+decrement(T& t) _NOEXCEPT
 {
     return __sync_add_and_fetch(&t, -1);
 }
@@ -32,10 +32,10 @@
 
 const allocator_arg_t allocator_arg = allocator_arg_t();
 
-bad_weak_ptr::~bad_weak_ptr() throw() {}
+bad_weak_ptr::~bad_weak_ptr() _NOEXCEPT {}
 
 const char*
-bad_weak_ptr::what() const throw()
+bad_weak_ptr::what() const _NOEXCEPT
 {
     return "bad_weak_ptr";
 }
@@ -45,13 +45,13 @@
 }
 
 void
-__shared_count::__add_shared()
+__shared_count::__add_shared() _NOEXCEPT
 {
     increment(__shared_owners_);
 }
 
 bool
-__shared_count::__release_shared()
+__shared_count::__release_shared() _NOEXCEPT
 {
     if (decrement(__shared_owners_) == -1)
     {
@@ -66,33 +66,33 @@
 }
 
 void
-__shared_weak_count::__add_shared()
+__shared_weak_count::__add_shared() _NOEXCEPT
 {
     __shared_count::__add_shared();
 }
 
 void
-__shared_weak_count::__add_weak()
+__shared_weak_count::__add_weak() _NOEXCEPT
 {
     increment(__shared_weak_owners_);
 }
 
 void
-__shared_weak_count::__release_shared()
+__shared_weak_count::__release_shared() _NOEXCEPT
 {
     if (__shared_count::__release_shared())
         __release_weak();
 }
 
 void
-__shared_weak_count::__release_weak()
+__shared_weak_count::__release_weak() _NOEXCEPT
 {
     if (decrement(__shared_weak_owners_) == -1)
         __on_zero_shared_weak();
 }
 
 __shared_weak_count*
-__shared_weak_count::lock()
+__shared_weak_count::lock() _NOEXCEPT
 {
     long object_owners = __shared_owners_;
     while (object_owners != -1)
@@ -112,7 +112,7 @@
 #ifndef _LIBCPP_NO_RTTI
 
 const void*
-__shared_weak_count::__get_deleter(const type_info&) const
+__shared_weak_count::__get_deleter(const type_info&) const _NOEXCEPT
 {
     return 0;
 }
@@ -135,7 +135,7 @@
 }
 
 pointer_safety
-get_pointer_safety()
+get_pointer_safety() _NOEXCEPT
 {
     return pointer_safety::relaxed;
 }

Modified: libcxx/trunk/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_destructible.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_destructible.pass.cpp?rev=132261&r1=132260&r2=132261&view=diff
==============================================================================
--- libcxx/trunk/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_destructible.pass.cpp (original)
+++ libcxx/trunk/test/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_destructible.pass.cpp Sat May 28 09:41:13 2011
@@ -60,10 +60,10 @@
 int main()
 {
     test_has_not_nothrow_destructor<void>();
-    test_has_not_nothrow_destructor<A>();
     test_has_not_nothrow_destructor<Abstract>();
     test_has_not_nothrow_destructor<NotEmpty>();
 
+    test_is_nothrow_destructible<A>();
     test_is_nothrow_destructible<int&>();
     test_is_nothrow_destructible<Union>();
     test_is_nothrow_destructible<Empty>();





More information about the cfe-commits mailing list