142ba740aSDamien L-G // 242ba740aSDamien L-G // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 342ba740aSDamien L-G // See https://llvm.org/LICENSE.txt for license information. 442ba740aSDamien L-G // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 542ba740aSDamien L-G // 642ba740aSDamien L-G //===----------------------------------------------------------------------===// 742ba740aSDamien L-G 842ba740aSDamien L-G // UNSUPPORTED: c++03, c++11, c++14, c++17 942ba740aSDamien L-G // XFAIL: !has-64-bit-atomics 1042ba740aSDamien L-G // XFAIL: !has-1024-bit-atomics 1142ba740aSDamien L-G 1242ba740aSDamien L-G // T operator=(T) const noexcept; 1342ba740aSDamien L-G 1442ba740aSDamien L-G #include <atomic> 1542ba740aSDamien L-G #include <cassert> 16*2e43a304SNikolas Klauser #include <concepts> 1742ba740aSDamien L-G #include <type_traits> 1842ba740aSDamien L-G 1942ba740aSDamien L-G #include "atomic_helpers.h" 2042ba740aSDamien L-G #include "test_helper.h" 2142ba740aSDamien L-G #include "test_macros.h" 2242ba740aSDamien L-G 2342ba740aSDamien L-G template <typename T> 2442ba740aSDamien L-G struct TestAssign { 2542ba740aSDamien L-G void operator()() const { 2642ba740aSDamien L-G { 2742ba740aSDamien L-G T x(T(1)); 2842ba740aSDamien L-G std::atomic_ref<T> const a(x); 2942ba740aSDamien L-G 3042ba740aSDamien L-G std::same_as<T> decltype(auto) y = (a = T(2)); 3142ba740aSDamien L-G assert(y == T(2)); 3242ba740aSDamien L-G assert(x == T(2)); 3342ba740aSDamien L-G 3442ba740aSDamien L-G ASSERT_NOEXCEPT(a = T(0)); 3542ba740aSDamien L-G static_assert(std::is_nothrow_assignable_v<std::atomic_ref<T>, T>); 3642ba740aSDamien L-G 3742ba740aSDamien L-G static_assert(!std::is_copy_assignable_v<std::atomic_ref<T>>); 3842ba740aSDamien L-G } 3942ba740aSDamien L-G 4042ba740aSDamien L-G { 4142ba740aSDamien L-G auto assign = [](std::atomic_ref<T> const& y, T, T new_val) { y = new_val; }; 4242ba740aSDamien L-G auto load = [](std::atomic_ref<T> const& y) { return y.load(); }; 4342ba740aSDamien L-G test_seq_cst<T>(assign, load); 4442ba740aSDamien L-G } 4542ba740aSDamien L-G } 4642ba740aSDamien L-G }; 4742ba740aSDamien L-G 4842ba740aSDamien L-G int main(int, char**) { 4942ba740aSDamien L-G TestEachAtomicType<TestAssign>()(); 5042ba740aSDamien L-G return 0; 5142ba740aSDamien L-G } 52