gcc/libgomp/testsuite/libgomp.c-c++-common/atomic-19.c
Jakub Jelinek 3a2bcffac6 openmp: Add support for OpenMP 5.1 atomics for C++
Besides the C++ FE changes, I've noticed that the C FE didn't reject
  #pragma omp atomic capture compare
  { v = x; x = y; }
and other forms of atomic swap, this patch fixes that too.  And the
c-family/ routine needed quite a few changes so that the new code
in it works fine with both FEs.

2021-09-17  Jakub Jelinek  <jakub@redhat.com>

gcc/c-family/
	* c-omp.c (c_finish_omp_atomic): Avoid creating
	TARGET_EXPR if test is true, use create_tmp_var_raw instead of
	create_tmp_var and add a zero initializer to TARGET_EXPRs that
	had NULL initializer.  When omitting operands after v = x,
	use type of v rather than type of x.  Fix type of vtmp
	TARGET_EXPR.
gcc/c/
	* c-parser.c (c_parser_omp_atomic): Reject atomic swap if capture
	is true.
gcc/cp/
	* cp-tree.h (finish_omp_atomic): Add r and weak arguments.
	* parser.c (cp_parser_omp_atomic): Update function comment for
	OpenMP 5.1 atomics, parse OpenMP 5.1 atomics and fail, compare and
	weak clauses.
	* semantics.c (finish_omp_atomic): Add r and weak arguments, handle
	them, handle COND_EXPRs.
	* pt.c (tsubst_expr): Adjust for COND_EXPR forms that
	finish_omp_atomic can now produce.
gcc/testsuite/
	* c-c++-common/gomp/atomic-18.c: Expect same diagnostics in C++ as in
	C.
	* c-c++-common/gomp/atomic-25.c: Drop c effective target.
	* c-c++-common/gomp/atomic-26.c: Likewise.
	* c-c++-common/gomp/atomic-27.c: Likewise.
	* c-c++-common/gomp/atomic-28.c: Likewise.
	* c-c++-common/gomp/atomic-29.c: Likewise.
	* c-c++-common/gomp/atomic-30.c: Likewise.  Adjust expected diagnostics
	for C++ when it differs from C.
	(foo): Change return type from double to void.
	* g++.dg/gomp/atomic-5.C: Adjust expected diagnostics wording.
	* g++.dg/gomp/atomic-20.C: New test.
libgomp/
	* testsuite/libgomp.c-c++-common/atomic-19.c: Drop c effective target.
	Use /* */ comments instead of //.
	* testsuite/libgomp.c-c++-common/atomic-20.c: Likewise.
	* testsuite/libgomp.c-c++-common/atomic-21.c: Likewise.
	* testsuite/libgomp.c++/atomic-16.C: New test.
	* testsuite/libgomp.c++/atomic-17.C: New test.
2021-09-17 11:28:31 +02:00

275 lines
5.3 KiB
C

/* { dg-do run } */
extern
#ifdef __cplusplus
"C"
#endif
void abort (void);
int x = 6;
int w, y;
int *
foo (void)
{
if (w)
abort ();
return &y;
}
int
main ()
{
int v, r;
#pragma omp atomic compare
x = x > 8 ? 8 : x;
#pragma omp atomic read
v = x;
if (v != 6)
abort ();
#pragma omp atomic compare
x = x > 4 ? 4 : x;
#pragma omp atomic read
v = x;
if (v != 4)
abort ();
#pragma omp atomic compare capture
v = x = x < 8 ? 8 : x;
if (v != 8)
abort ();
#pragma omp atomic read
v = x;
if (v != 8)
abort ();
#pragma omp atomic capture compare
{ v = x; x = x < 12 ? 12 : x; }
if (v != 8)
abort ();
#pragma omp atomic read
v = x;
if (v != 12)
abort ();
#pragma omp atomic capture compare
{ v = x; x = x < 4 ? 4 : x; }
if (v != 12)
abort ();
#pragma omp atomic read
v = x;
if (v != 12)
abort ();
#pragma omp atomic write
x = -32;
#pragma omp atomic capture compare seq_cst fail(relaxed)
{ x = 12U < x ? 12U : x; v = x; }
if (v != 12)
abort ();
#pragma omp atomic read
v = x;
if (v != 12)
abort ();
#pragma omp atomic compare
x = x == 12 ? 16 : x;
#pragma omp atomic read
v = x;
if (v != 16)
abort ();
r = 57;
#pragma omp atomic compare capture
v = x = x == 15 ? r + 7 : x;
if (v != 16)
abort ();
#pragma omp atomic read
v = x;
if (v != 16)
abort ();
#pragma omp atomic capture, update, compare seq_cst fail(acquire)
{ v = x; x = x == 73ULL - r ? 12LL : x; }
if (v != 16)
abort ();
#pragma omp atomic read
v = x;
if (v != 12)
abort ();
#pragma omp atomic update, compare, capture
{ x = x == 69LL - r ? (unsigned char) 6 : x; v = x; }
if (v != 6)
abort ();
#pragma omp atomic read
v = x;
if (v != 6)
abort ();
#pragma omp atomic compare
if (x > 8) { x = 8; }
#pragma omp atomic read
v = x;
if (v != 6)
abort ();
#pragma omp atomic compare
if (x > 4) { x = 4; }
#pragma omp atomic read
v = x;
if (v != 4)
abort ();
#pragma omp atomic compare capture
{ if (x < 8) { x = 8; } v = x; }
if (v != 8)
abort ();
#pragma omp atomic read
v = x;
if (v != 8)
abort ();
#pragma omp atomic capture compare
{ v = x; if (x < 12) { x = 12; } }
if (v != 8)
abort ();
#pragma omp atomic read
v = x;
if (v != 12)
abort ();
#pragma omp atomic capture compare
{ v = x; if (x < 4) { x = 4; } }
if (v != 12)
abort ();
#pragma omp atomic read
v = x;
if (v != 12)
abort ();
#pragma omp atomic write
x = -32;
#pragma omp atomic capture compare seq_cst fail(relaxed)
{ if (12U < x) { x = 12U; } v = x; }
if (v != 12)
abort ();
#pragma omp atomic read
v = x;
if (v != 12)
abort ();
#pragma omp atomic compare
if (x == 12) { x = 16; }
#pragma omp atomic read
v = x;
if (v != 16)
abort ();
r = 57;
#pragma omp atomic compare capture
{ if (x == 15) { x = r + 7; } v = x; }
if (v != 16)
abort ();
#pragma omp atomic read
v = x;
if (v != 16)
abort ();
#pragma omp atomic capture, update, compare seq_cst fail(acquire)
{ v = x; if (x == 73ULL - r) { x = 12LL; } }
if (v != 16)
abort ();
#pragma omp atomic read
v = x;
if (v != 12)
abort ();
#pragma omp atomic update, compare, capture
{ if (x == 69LL - r) { x = (unsigned char) 6; } v = x; }
if (v != 6)
abort ();
#pragma omp atomic read
v = x;
if (v != 6)
abort ();
v = 24;
#pragma omp atomic compare capture
if (x == 12) { x = 16; } else { v = x; }
if (v != 6)
abort ();
v = 32;
#pragma omp atomic read
v = x;
if (v != 6)
abort ();
v = 147;
#pragma omp atomic capture compare
if (x == 6) { x = 57; } else { v = x; }
if (v != 147)
abort ();
#pragma omp atomic read
v = x;
if (v != 57)
abort ();
#pragma omp atomic update, capture, compare, weak, seq_cst, fail (relaxed)
{ r = x == 137; if (r) { x = 174; } }
if (r)
abort ();
#pragma omp atomic read
v = x;
if (v != 57)
abort ();
#pragma omp atomic compare capture fail (relaxed)
{ r = x == 57; if (r) { x = 6; } }
if (r != 1)
abort ();
#pragma omp atomic read
v = x;
if (v != 6)
abort ();
v = -5;
#pragma omp atomic capture compare
{ r = x == 17; if (r) { x = 25; } else { v = x; } }
if (r || v != 6)
abort ();
#pragma omp atomic read
v = x;
if (v != 6)
abort ();
v = 15;
#pragma omp atomic capture compare
{ r = x == 6; if (r) { x = 23; } else { v = x; } }
if (r != 1 || v != 15)
abort ();
#pragma omp atomic read
v = x;
if (v != 23)
abort ();
w = 1;
#pragma omp atomic compare capture
if (x == 23) { x = 57; } else { foo ()[0] = x; }
#pragma omp atomic read
v = x;
if (v != 57)
abort ();
#pragma omp atomic capture update compare
{ r = x == 57; if (r) { x = 23; } else { foo ()[0] = x; } }
if (r != 1)
abort ();
#pragma omp atomic read
v = x;
if (v != 23)
abort ();
w = 0;
#pragma omp atomic compare capture
if (x == 24) { x = 57; } else { foo ()[0] = x; }
if (y != 23)
abort ();
#pragma omp atomic read
v = x;
if (v != 23)
abort ();
y = -5;
#pragma omp atomic capture update compare
{
r = x == 57;
if (r)
{
x = 27;
}
else
{
foo ()[0] = x;
}
}
if (r || y != 23)
abort ();
#pragma omp atomic read
v = x;
if (v != 23)
abort ();
return 0;
}