[libc++] Add -Watomic-memory-ordering diagnostic tests for atomic_ref (#130206)

Fix #130053
This commit is contained in:
Damien L-G
2025-03-10 16:32:13 -04:00
committed by GitHub
parent f84f4e1e05
commit e235432867
11 changed files with 190 additions and 0 deletions

View File

@@ -1,3 +1,4 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.

View File

@@ -1,3 +1,4 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.

View File

@@ -1,3 +1,4 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.

View File

@@ -1,3 +1,4 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.

View File

@@ -1,3 +1,4 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.

View File

@@ -1,3 +1,4 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.

View File

@@ -0,0 +1,39 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// REQUIRES: diagnose-if-support
// UNSUPPORTED: c++03, c++11, c++14, c++17
// <atomic>
// bool compare_exchange_strong(T& expected, T desired, memory_order success,
// memory_order failure) const noexcept;
//
// Preconditions: failure is memory_order::relaxed, memory_order::consume,
// memory_order::acquire, or memory_order::seq_cst.
#include <atomic>
void test() {
using T = int;
T x(T(1));
std::atomic_ref const a(x);
T expected(T(2));
T const desired(T(3));
std::memory_order const success = std::memory_order_relaxed;
// clang-format off
a.compare_exchange_strong(expected, desired, success, std::memory_order_relaxed);
a.compare_exchange_strong(expected, desired, success, std::memory_order_consume);
a.compare_exchange_strong(expected, desired, success, std::memory_order_acquire);
a.compare_exchange_strong(expected, desired, success, std::memory_order_seq_cst);
a.compare_exchange_strong(expected, desired, success, std::memory_order_release); // expected-warning {{memory order argument to atomic operation is invalid}}
a.compare_exchange_strong(expected, desired, success, std::memory_order_acq_rel); // expected-warning {{memory order argument to atomic operation is invalid}}
// clang-format on
}

View File

@@ -0,0 +1,39 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// REQUIRES: diagnose-if-support
// UNSUPPORTED: c++03, c++11, c++14, c++17
// <atomic>
// bool compare_exchange_weak(T& expected, T desired, memory_order success,
// memory_order failure) const noexcept;
//
// Preconditions: failure is memory_order::relaxed, memory_order::consume,
// memory_order::acquire, or memory_order::seq_cst.
#include <atomic>
void test() {
using T = int;
T x(T(42));
std::atomic_ref const a(x);
T expected(T(2));
T const desired(T(3));
std::memory_order const success = std::memory_order_relaxed;
// clang-format off
a.compare_exchange_weak(expected, desired, success, std::memory_order_relaxed);
a.compare_exchange_weak(expected, desired, success, std::memory_order_consume);
a.compare_exchange_weak(expected, desired, success, std::memory_order_acquire);
a.compare_exchange_weak(expected, desired, success, std::memory_order_seq_cst);
a.compare_exchange_weak(expected, desired, success, std::memory_order_release); // expected-warning {{memory order argument to atomic operation is invalid}}
a.compare_exchange_weak(expected, desired, success, std::memory_order_acq_rel); // expected-warning {{memory order argument to atomic operation is invalid}}
// clang-format on
}

View File

@@ -0,0 +1,34 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// REQUIRES: diagnose-if-support
// UNSUPPORTED: c++03, c++11, c++14, c++17
// <atomic>
// T load(memory_order order = memory_order::seq_cst) const noexcept;
//
// Preconditions: order is memory_order::relaxed, memory_order::consume, memory_order::acquire, or memory_order::seq_cst.
#include <atomic>
void test() {
using T = int;
T x(T(1));
std::atomic_ref const a(x);
// clang-format off
(void)a.load(std::memory_order_relaxed);
(void)a.load(std::memory_order_consume);
(void)a.load(std::memory_order_acquire);
(void)a.load(std::memory_order_seq_cst);
(void)a.load(std::memory_order_release); // expected-warning {{memory order argument to atomic operation is invalid}}
(void)a.load(std::memory_order_acq_rel); // expected-warning {{memory order argument to atomic operation is invalid}}
// clang-format on
}

View File

@@ -0,0 +1,36 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// REQUIRES: diagnose-if-support
// UNSUPPORTED: c++03, c++11, c++14, c++17
// <atomic>
// void store(T desired, memory_order order = memory_order::seq_cst) const noexcept;
//
// Preconditions: order is memory_order::relaxed, memory_order::release, or memory_order::seq_cst.
#include <atomic>
void test() {
using T = int;
T x(T(1));
std::atomic_ref const a(x);
T const desired(T(2));
// clang-format off
a.store(desired, std::memory_order_relaxed);
a.store(desired, std::memory_order_release);
a.store(desired, std::memory_order_seq_cst);
a.store(desired, std::memory_order_consume); // expected-warning {{memory order argument to atomic operation is invalid}}
a.store(desired, std::memory_order_acquire); // expected-warning {{memory order argument to atomic operation is invalid}}
a.store(desired, std::memory_order_acq_rel); // expected-warning {{memory order argument to atomic operation is invalid}}
// clang-format on
}

View File

@@ -0,0 +1,36 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// REQUIRES: diagnose-if-support
// UNSUPPORTED: c++03, c++11, c++14, c++17
// <atomic>
// void wait(T old, memory_order order = memory_order::seq_cst) const noexcept;
//
// Preconditions: order is memory_order::relaxed, memory_order::consume, memory_order::acquire, or memory_order::seq_cst.
#include <atomic>
void test() {
using T = int;
T x(T(1));
std::atomic_ref const a(x);
T const old(T(2));
// clang-format off
a.wait(old, std::memory_order_relaxed);
a.wait(old, std::memory_order_consume);
a.wait(old, std::memory_order_acquire);
a.wait(old, std::memory_order_seq_cst);
a.wait(old, std::memory_order_release); // expected-warning {{memory order argument to atomic operation is invalid}}
a.wait(old, std::memory_order_acq_rel); // expected-warning {{memory order argument to atomic operation is invalid}}
// clang-format on
}