gcc/libgomp/testsuite/libgomp.c-c++-common/cancel-taskgroup-3.c
Jakub Jelinek 6997628d35 re PR libgomp/87995 (libgomp.c/../libgomp.c-c++-common/cancel-taskgroup-3.c fails consistently after r265930)
PR libgomp/87995
	* testsuite/libgomp.c-c++-common/cancel-taskgroup-3.c: Require
	tls_runtime effective target.
	(t): New threadprivate variable.
	(main): Set t in threads which execute iterations of the worksharing
	loop.  Propagate that to the task after the loop and don't abort
	if the current taskgroup hasn't been cancelled.

From-SVN: r266904
2018-12-08 09:58:24 +01:00

74 lines
1.2 KiB
C

/* { dg-do run { target tls_runtime } } */
/* { dg-set-target-env-var OMP_CANCELLATION "true" } */
#include <stdlib.h>
#include <omp.h>
int t;
#pragma omp threadprivate (t)
int
main ()
{
int a = 0, i;
#pragma omp parallel
#pragma omp taskgroup
{
#pragma omp task
{
#pragma omp cancel taskgroup
if (omp_get_cancellation ())
abort ();
}
#pragma omp taskwait
#pragma omp for reduction (task, +: a)
for (i = 0; i < 64; ++i)
{
a++;
#pragma omp task in_reduction (+: a)
{
volatile int zero = 0;
a += zero;
if (omp_get_cancellation ())
abort ();
}
}
if (a != 64)
abort ();
#pragma omp task
{
if (omp_get_cancellation ())
abort ();
}
}
a = 0;
#pragma omp parallel
#pragma omp taskgroup
{
int p;
#pragma omp for reduction (task, +: a)
for (i = 0; i < 64; ++i)
{
a++;
t = 1;
#pragma omp task in_reduction (+: a)
{
volatile int zero = 0;
a += zero;
#pragma omp cancel taskgroup
if (omp_get_cancellation ())
abort ();
}
}
if (a != 64)
abort ();
p = t;
#pragma omp task firstprivate (p)
{
if (p && omp_get_cancellation ())
abort ();
}
}
return 0;
}