/* { dg-do run } */ /* { dg-set-target-env-var OMP_CANCELLATION "true" } */ #include #include #include static void foo (int *x) { #pragma omp parallel firstprivate(x) num_threads (32) { int thr = omp_get_thread_num (); switch (x[thr]) { case 4: #pragma omp cancel parallel break; case 3: #pragma omp task usleep (1000); #pragma omp task usleep (2000); #pragma omp task usleep (4000); break; case 2: usleep (1000); /* FALLTHRU */ case 1: #pragma omp cancellation point parallel break; } #pragma omp barrier if (omp_get_cancellation ()) abort (); } } int main () { int i, j, x[32] = { 0, 1, 2, 4, 2, 2, 1, 0 }; foo (x); for (i = 0; i < 32; i++) { for (j = 0; j < 32; j++) x[j] = rand () & 3; x[rand () & 31] = 4; foo (x); } return 0; }