// { dg-do run } #include __attribute__((noinline, noclone)) void foo (int &a, short &d, char &g) { unsigned long b = 12; unsigned long &c = b; long long e = 21; long long &f = e; unsigned int h = 12; unsigned int &k = h; #pragma omp parallel default(none) private(a, c) firstprivate(d, f) shared(g, k) { int i = omp_get_thread_num (); a = i; c = 2 * i; if (d != 27 || f != 21) __builtin_abort (); d = 3 * (i & 0xfff); f = 4 * i; #pragma omp barrier if (a != i || c != 2 * i || d != 3 * (i & 0xfff) || f != 4 * i) __builtin_abort (); #pragma omp for lastprivate(g, k) for (int j = 0; j < 32; j++) { g = j; k = 3 * j; } } if (g != 31 || k != 31 * 3) __builtin_abort (); #pragma omp parallel for firstprivate (g, k) lastprivate (g, k) for (int j = 0; j < 32; j++) { if (g != 31 || k != 31 * 3) __builtin_abort (); if (j == 31) { g = 29; k = 138; } } if (g != 29 || k != 138) __builtin_abort (); } int main () { int a = 5; short d = 27; char g = ' '; foo (a, d, g); }