/* { dg-do run } */ #include #include #include int main (int argc, char **argv[]) { int n = argc < 5 ? 12 : 31, i, m, l; char a[n + 3]; unsigned short b[n / 2 - 1]; int c[n * 2 + 1]; for (i = 0; i < n + 3; i++) a[i] = i; for (i = 0; i < n / 2 - 1; i++) b[i] = (i << 8) | i; for (i = 0; i < n * 2 + 1; i++) c[i] = (i << 24) | i; l = 0; m = n; #pragma omp parallel default (shared) num_threads (4) \ firstprivate (a, m) private (b, i) reduction (+:l) { for (i = 0; i < m + 3; i++) if (a[i] != i) l++; for (i = 0; i < m * 2 + 1; i++) if (c[i] != ((i << 24) | i)) l++; #pragma omp barrier memset (a, omp_get_thread_num (), m + 3); for (i = 0; i < m / 2 - 1; i++) b[i] = a[0] + 7; #pragma omp master { for (i = 0; i < m * 2 + 1; i++) c[i] = a[0] + 16; } #pragma omp barrier if (a[0] != omp_get_thread_num ()) l++; for (i = 1; i < m + 3; i++) if (a[i] != a[0]) l++; for (i = 0; i < m / 2 - 1; i++) if (b[i] != a[0] + 7) l++; for (i = 0; i < m * 2 + 1; i++) if (c[i] != 16) l++; } if (l) abort (); for (i = 0; i < n * 2 + 1; i++) if (c[i] != 16) l++; return 0; }