diff --git a/libcxx/docs/Cxx2aStatus.rst b/libcxx/docs/Cxx2aStatus.rst --- a/libcxx/docs/Cxx2aStatus.rst +++ b/libcxx/docs/Cxx2aStatus.rst @@ -56,4 +56,4 @@ :header-rows: 1 :widths: auto -Last Updated: 24-May-2021 +Last Updated: 6-June-2021 diff --git a/libcxx/docs/Cxx2aStatusIssuesStatus.csv b/libcxx/docs/Cxx2aStatusIssuesStatus.csv --- a/libcxx/docs/Cxx2aStatusIssuesStatus.csv +++ b/libcxx/docs/Cxx2aStatusIssuesStatus.csv @@ -34,7 +34,7 @@ "`2980 `__","Cannot compare_exchange empty pointers","Albuquerque","","" "`2981 `__","Remove redundant deduction guides from standard library","Albuquerque","","" "`2982 `__","Making size_type consistent in associative container deduction guides","Albuquerque","","" -"`2988 `__","Clause 32 cleanup missed one typename","Albuquerque","","" +"`2988 `__","Clause 32 cleanup missed one typename","Albuquerque","|Complete|","13.0" "`2993 `__","reference_wrapper conversion from T&&","Albuquerque","|Complete|","13.0" "`2998 `__","Requirements on function objects passed to {``forward_``,}list-specific algorithms","Albuquerque","|Nothing To Do|","" "`3001 `__","weak_ptr::element_type needs remove_extent_t","Albuquerque","","" diff --git a/libcxx/include/atomic b/libcxx/include/atomic --- a/libcxx/include/atomic +++ b/libcxx/include/atomic @@ -261,196 +261,145 @@ }; -template - bool atomic_is_lock_free(const volatile atomic* obj) noexcept; - -template - bool atomic_is_lock_free(const atomic* obj) noexcept; - -template - void atomic_store(volatile atomic* obj, T desr) noexcept; - -template - void atomic_store(atomic* obj, T desr) noexcept; - -template - void atomic_store_explicit(volatile atomic* obj, T desr, memory_order m) noexcept; - -template - void atomic_store_explicit(atomic* obj, T desr, memory_order m) noexcept; - -template - T atomic_load(const volatile atomic* obj) noexcept; - -template - T atomic_load(const atomic* obj) noexcept; - -template - T atomic_load_explicit(const volatile atomic* obj, memory_order m) noexcept; - -template - T atomic_load_explicit(const atomic* obj, memory_order m) noexcept; - -template - T atomic_exchange(volatile atomic* obj, T desr) noexcept; - -template - T atomic_exchange(atomic* obj, T desr) noexcept; - -template - T atomic_exchange_explicit(volatile atomic* obj, T desr, memory_order m) noexcept; - -template - T atomic_exchange_explicit(atomic* obj, T desr, memory_order m) noexcept; - -template - bool atomic_compare_exchange_weak(volatile atomic* obj, T* expc, T desr) noexcept; - -template - bool atomic_compare_exchange_weak(atomic* obj, T* expc, T desr) noexcept; - -template - bool atomic_compare_exchange_strong(volatile atomic* obj, T* expc, T desr) noexcept; - -template - bool atomic_compare_exchange_strong(atomic* obj, T* expc, T desr) noexcept; - -template - bool atomic_compare_exchange_weak_explicit(volatile atomic* obj, T* expc, - T desr, - memory_order s, memory_order f) noexcept; - -template - bool atomic_compare_exchange_weak_explicit(atomic* obj, T* expc, T desr, - memory_order s, memory_order f) noexcept; - -template - bool atomic_compare_exchange_strong_explicit(volatile atomic* obj, - T* expc, T desr, - memory_order s, memory_order f) noexcept; - -template - bool atomic_compare_exchange_strong_explicit(atomic* obj, T* expc, - T desr, - memory_order s, memory_order f) noexcept; - -template - void atomic_wait(const volatile atomic* obj, T old) noexcept; - -template - void atomic_wait(const atomic* obj, T old) noexcept; - -template - void atomic_wait_explicit(const volatile atomic* obj, T old, memory_order m) noexcept; - -template - void atomic_wait_explicit(const atomic* obj, T old, memory_order m) noexcept; - -template - void atomic_one(volatile atomic* obj) noexcept; - -template - void atomic_one(atomic* obj) noexcept; - -template - void atomic_all(volatile atomic* obj) noexcept; - -template - void atomic_all(atomic* obj) noexcept; - -template - Integral atomic_fetch_add(volatile atomic* obj, Integral op) noexcept; - -template - Integral atomic_fetch_add(atomic* obj, Integral op) noexcept; - -template - Integral atomic_fetch_add_explicit(volatile atomic* obj, Integral op, - memory_order m) noexcept; -template - Integral atomic_fetch_add_explicit(atomic* obj, Integral op, - memory_order m) noexcept; -template - Integral atomic_fetch_sub(volatile atomic* obj, Integral op) noexcept; - -template - Integral atomic_fetch_sub(atomic* obj, Integral op) noexcept; - -template - Integral atomic_fetch_sub_explicit(volatile atomic* obj, Integral op, - memory_order m) noexcept; - -template - Integral atomic_fetch_sub_explicit(atomic* obj, Integral op, - memory_order m) noexcept; - -template - Integral atomic_fetch_and(volatile atomic* obj, Integral op) noexcept; - -template - Integral atomic_fetch_and(atomic* obj, Integral op) noexcept; - -template - Integral atomic_fetch_and_explicit(volatile atomic* obj, Integral op, - memory_order m) noexcept; - -template - Integral atomic_fetch_and_explicit(atomic* obj, Integral op, - memory_order m) noexcept; - -template - Integral atomic_fetch_or(volatile atomic* obj, Integral op) noexcept; - -template - Integral atomic_fetch_or(atomic* obj, Integral op) noexcept; - -template - Integral atomic_fetch_or_explicit(volatile atomic* obj, Integral op, - memory_order m) noexcept; - -template - Integral atomic_fetch_or_explicit(atomic* obj, Integral op, - memory_order m) noexcept; - -template - Integral atomic_fetch_xor(volatile atomic* obj, Integral op) noexcept; - -template - Integral atomic_fetch_xor(atomic* obj, Integral op) noexcept; - -template - Integral atomic_fetch_xor_explicit(volatile atomic* obj, Integral op, - memory_order m) noexcept; - -template - Integral atomic_fetch_xor_explicit(atomic* obj, Integral op, - memory_order m) noexcept; - -template - T* atomic_fetch_add(volatile atomic* obj, ptrdiff_t op) noexcept; - -template - T* atomic_fetch_add(atomic* obj, ptrdiff_t op) noexcept; - -template - T* atomic_fetch_add_explicit(volatile atomic* obj, ptrdiff_t op, - memory_order m) noexcept; - -template - T* atomic_fetch_add_explicit(atomic* obj, ptrdiff_t op, memory_order m) noexcept; - -template - T* atomic_fetch_sub(volatile atomic* obj, ptrdiff_t op) noexcept; - -template - T* atomic_fetch_sub(atomic* obj, ptrdiff_t op) noexcept; - -template - T* atomic_fetch_sub_explicit(volatile atomic* obj, ptrdiff_t op, - memory_order m) noexcept; - -template - T* atomic_fetch_sub_explicit(atomic* obj, ptrdiff_t op, memory_order m) noexcept; +// [atomics.nonmembers], non-member functions +template + bool atomic_is_lock_free(const volatile atomic*) noexcept; +template + bool atomic_is_lock_free(const atomic*) noexcept; +template + void atomic_store(volatile atomic*, typename atomic::value_type) noexcept; +template + void atomic_store(atomic*, typename atomic::value_type) noexcept; +template + void atomic_store_explicit(volatile atomic*, typename atomic::value_type, + memory_order) noexcept; +template + void atomic_store_explicit(atomic*, typename atomic::value_type, + memory_order) noexcept; +template + T atomic_load(const volatile atomic*) noexcept; +template + T atomic_load(const atomic*) noexcept; +template + T atomic_load_explicit(const volatile atomic*, memory_order) noexcept; +template + T atomic_load_explicit(const atomic*, memory_order) noexcept; +template + T atomic_exchange(volatile atomic*, typename atomic::value_type) noexcept; +template + T atomic_exchange(atomic*, typename atomic::value_type) noexcept; +template + T atomic_exchange_explicit(volatile atomic*, typename atomic::value_type, + memory_order) noexcept; +template + T atomic_exchange_explicit(atomic*, typename atomic::value_type, + memory_order) noexcept; +template + bool atomic_compare_exchange_weak(volatile atomic*, + typename atomic::value_type*, + typename atomic::value_type) noexcept; +template + bool atomic_compare_exchange_weak(atomic*, + typename atomic::value_type*, + typename atomic::value_type) noexcept; +template + bool atomic_compare_exchange_strong(volatile atomic*, + typename atomic::value_type*, + typename atomic::value_type) noexcept; +template + bool atomic_compare_exchange_strong(atomic*, + typename atomic::value_type*, + typename atomic::value_type) noexcept; +template + bool atomic_compare_exchange_weak_explicit(volatile atomic*, + typename atomic::value_type*, + typename atomic::value_type, + memory_order, memory_order) noexcept; +template + bool atomic_compare_exchange_weak_explicit(atomic*, + typename atomic::value_type*, + typename atomic::value_type, + memory_order, memory_order) noexcept; +template + bool atomic_compare_exchange_strong_explicit(volatile atomic*, + typename atomic::value_type*, + typename atomic::value_type, + memory_order, memory_order) noexcept; +template + bool atomic_compare_exchange_strong_explicit(atomic*, + typename atomic::value_type*, + typename atomic::value_type, + memory_order, memory_order) noexcept; + +template + T atomic_fetch_add(volatile atomic*, typename atomic::difference_type) noexcept; +template + T atomic_fetch_add(atomic*, typename atomic::difference_type) noexcept; +template + T atomic_fetch_add_explicit(volatile atomic*, typename atomic::difference_type, + memory_order) noexcept; +template + T atomic_fetch_add_explicit(atomic*, typename atomic::difference_type, + memory_order) noexcept; +template + T atomic_fetch_sub(volatile atomic*, typename atomic::difference_type) noexcept; +template + T atomic_fetch_sub(atomic*, typename atomic::difference_type) noexcept; +template + T atomic_fetch_sub_explicit(volatile atomic*, typename atomic::difference_type, + memory_order) noexcept; +template + T atomic_fetch_sub_explicit(atomic*, typename atomic::difference_type, + memory_order) noexcept; +template + T atomic_fetch_and(volatile atomic*, typename atomic::value_type) noexcept; +template + T atomic_fetch_and(atomic*, typename atomic::value_type) noexcept; +template + T atomic_fetch_and_explicit(volatile atomic*, typename atomic::value_type, + memory_order) noexcept; +template + T atomic_fetch_and_explicit(atomic*, typename atomic::value_type, + memory_order) noexcept; +template + T atomic_fetch_or(volatile atomic*, typename atomic::value_type) noexcept; +template + T atomic_fetch_or(atomic*, typename atomic::value_type) noexcept; +template + T atomic_fetch_or_explicit(volatile atomic*, typename atomic::value_type, + memory_order) noexcept; +template + T atomic_fetch_or_explicit(atomic*, typename atomic::value_type, + memory_order) noexcept; +template + T atomic_fetch_xor(volatile atomic*, typename atomic::value_type) noexcept; +template + T atomic_fetch_xor(atomic*, typename atomic::value_type) noexcept; +template + T atomic_fetch_xor_explicit(volatile atomic*, typename atomic::value_type, + memory_order) noexcept; +template + T atomic_fetch_xor_explicit(atomic*, typename atomic::value_type, + memory_order) noexcept; + +template + void atomic_wait(const volatile atomic*, typename atomic::value_type); +template + void atomic_wait(const atomic*, typename atomic::value_type); +template + void atomic_wait_explicit(const volatile atomic*, typename atomic::value_type, + memory_order); +template + void atomic_wait_explicit(const atomic*, typename atomic::value_type, + memory_order); +template + void atomic_notify_one(volatile atomic*); +template + void atomic_notify_one(atomic*); +template + void atomic_notify_all(volatile atomic*); +template + void atomic_notify_all(atomic*); // Atomics for standard typedef types