1/* { dg-do run } */
2/* { dg-options "-fopenmp -O0" } */
3
4#include <omp.h>
5#include <stdlib.h>
6
7short e[64];
8int g;
9_Complex double d, f;
10int num_threads;
11
12__attribute__((noinline)) void
13foo (int x, long long y)
14{
15#pragma omp parallel num_threads (4)
16  {
17    int i;
18    #pragma omp barrier
19    for (i = 0; i < 2400; i++)
20      {
21	if (i == 0)
22	  num_threads = omp_get_num_threads ();
23	#pragma omp atomic
24	  e[0] += x;
25	#pragma omp atomic
26	  e[16] += x;
27	#pragma omp atomic
28	  g += y;
29	#pragma omp atomic
30	  __real__ d += x;
31	#pragma omp atomic
32	  __imag__ f += x;
33      }
34  }
35}
36
37int
38main (void)
39{
40  int i;
41  foo (3, 3LL);
42  if (g != 3 * 2400 * num_threads
43      || __real__ d != g || __imag__ d != 0
44      || __real__ f != 0 || __imag__ f != g)
45    abort ();
46  for (i = 0; i < 64; i++)
47    if (e[i] != ((i && i != 16) ? 0 : g))
48      abort ();
49  return 0;
50}
51