[libcxx-commits] [libcxx] [libc++] cv-qualified types in atomic and atomic_ref (P3323R1) (PR #121414)

Louis Dionne via libcxx-commits libcxx-commits at lists.llvm.org
Fri Jan 31 12:34:43 PST 2025


================
@@ -20,26 +20,42 @@
 #include "test_helper.h"
 #include "test_macros.h"
 
-template <typename T>
+template <typename U>
----------------
ldionne wrote:

I would suggest the following pattern for the tests:

```c++
template <typename T>
struct TestAssign {
  void operator()() const {
    static_assert(std::is_assignable_v<std::atomic_ref<T>, T> == !std::is_const_v<T>);

    using Unqualified = std::remove_cv_t<T>;
    if constexpr (!std::is_const_v<T>) {
        {
            T x(Unqualified(1));
            std::atomic_ref<T> const a(x);

            std::same_as<Unqualified> decltype(auto) y = (a = Unqualified(2));
            assert(y == Unqualified(2));
            assert(Unqualified(x) == Unqualified(2));

            ASSERT_NOEXCEPT(a = Unqualified(0));
            static_assert(std::is_nothrow_assignable_v<std::atomic_ref<T>, T>);
            static_assert(!std::is_copy_assignable_v<std::atomic_ref<T>>);
        }

        {
            auto assign = [](std::atomic_ref<T> const& y, T const&, T const& new_val) {
                y = const_cast<Unqualified const&>(new_val);
            };
            auto load = [](std::atomic_ref<T> const& y) { return y.load(); };
            test_seq_cst<T>(assign, load);
        }
    }
  }
};

template <template <class...> class F>
struct CallWithCVQualifiers {
    template <class T>
    struct apply {
        void operator()() const {
            F<T>();
            F<T const>();
            F<T volatile>();
            F<T const volatile>();
        }
    };
};

int main() {
    TestEachAtomicType<CallWithCVQualifiers<TestAssign>::apply>()();
}

```

https://github.com/llvm/llvm-project/pull/121414


More information about the libcxx-commits mailing list