|  | // { dg-do run } | 
|  |  | 
|  | #include <omp.h> | 
|  |  | 
|  | __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); | 
|  | } |