blob: c4ab876db2acbcc887502cf10d94477503f97599 [file] [log] [blame]
// { dg-options "-std=gnu++20" }
// { dg-do run { target c++20 } }
// { dg-add-options libatomic }
#include <atomic>
#include <testsuite_hooks.h>
struct S { char c; short s; };
void __attribute__((noinline,noipa))
fill_struct(S& s)
{ __builtin_memset(&s, 0xff, sizeof(S)); }
bool
compare_struct(const S& a, const S& b)
{ return __builtin_memcmp(&a, &b, sizeof(S)) == 0; }
int
main ()
{
S s;
fill_struct(s);
s.c = 'a';
s.s = 42;
std::atomic<S> as{ s };
auto ts = as.load();
VERIFY( !compare_struct(s, ts) ); // padding cleared on construction
as.exchange(s);
auto es = as.load();
VERIFY( compare_struct(ts, es) ); // padding cleared on exchange
S n;
fill_struct(n);
n.c = 'b';
n.s = 71;
// padding cleared on compexchg
VERIFY( as.compare_exchange_weak(s, n) );
VERIFY( as.compare_exchange_strong(n, s) );
return 0;
}