xref: /llvm-project/libcxx/test/std/atomics/atomics.ref/assign.pass.cpp (revision 2e43a304f10fd801f068d0f9831f01f2c5b0b2e2)
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