@@ -7,6 +7,15 @@ using namespace mcpplibs::primitives;
77
88namespace {
99struct NullCapabilityProbe {};
10+
11+ struct NonTriviallyCopyableRep {
12+ int value{0 };
13+ ~NonTriviallyCopyableRep () {}
14+ };
15+
16+ struct LowAlignmentRep {
17+ unsigned char bytes[sizeof (std::uint64_t )]{};
18+ };
1019} // namespace
1120
1221template <> struct operations ::traits<NullCapabilityProbe> {
@@ -127,6 +136,38 @@ TEST(PolicyConcurrencyTest, PrimitiveAccessHandlerProtocolByPolicy) {
127136 int >));
128137}
129138
139+ TEST (PolicyConcurrencyTest, PrimitiveAccessRejectsNonTriviallyCopyableRep) {
140+ EXPECT_FALSE ((
141+ policy::concurrency::handler_access_available<policy::concurrency::fenced,
142+ NonTriviallyCopyableRep>));
143+ EXPECT_FALSE ((policy::concurrency::handler_access_available<
144+ policy::concurrency::fenced_relaxed, NonTriviallyCopyableRep>));
145+ EXPECT_FALSE ((policy::concurrency::handler_access_available<
146+ policy::concurrency::fenced_acq_rel, NonTriviallyCopyableRep>));
147+ EXPECT_FALSE ((policy::concurrency::handler_access_available<
148+ policy::concurrency::fenced_seq_cst, NonTriviallyCopyableRep>));
149+ }
150+
151+ TEST (PolicyConcurrencyTest, PrimitiveAccessRespectsAtomicRefAlignmentGate) {
152+ constexpr bool requires_stronger_alignment =
153+ std::atomic_ref<LowAlignmentRep>::required_alignment >
154+ alignof (LowAlignmentRep);
155+
156+ if constexpr (requires_stronger_alignment) {
157+ EXPECT_FALSE ((policy::concurrency::handler_access_available<
158+ policy::concurrency::fenced, LowAlignmentRep>));
159+ EXPECT_FALSE ((policy::concurrency::handler_access_available<
160+ policy::concurrency::fenced_relaxed, LowAlignmentRep>));
161+ EXPECT_FALSE ((policy::concurrency::handler_access_available<
162+ policy::concurrency::fenced_acq_rel, LowAlignmentRep>));
163+ EXPECT_FALSE ((policy::concurrency::handler_access_available<
164+ policy::concurrency::fenced_seq_cst, LowAlignmentRep>));
165+ } else {
166+ GTEST_SKIP () << " platform atomic_ref required_alignment does not exceed "
167+ " alignof(LowAlignmentRep)" ;
168+ }
169+ }
170+
130171TEST (PolicyProtocolTest, BuiltinHandlersSatisfyProtocolConcepts) {
131172 static_assert (policy::type::handler_protocol<policy::type::strict,
132173 operations::Addition, int , int >);
0 commit comments