1#include <omp.h>
2
3extern "C" void abort (void);
4
5struct Y
6{
7  int l[5][10];
8};
9
10struct X
11{
12  struct Y y;
13  float b[10];
14};
15
16void
17parallel (int a, int b)
18{
19  int i, j;
20  struct X A[10][5];
21  a = b = 3;
22
23  for (i = 0; i < 10; i++)
24    for (j = 0; j < 5; j++)
25      A[i][j].y.l[3][3] = -10;
26
27  #pragma omp parallel shared (a, b, A) num_threads (5)
28    {
29      int i, j;
30
31      #pragma omp atomic
32      a += omp_get_num_threads ();
33
34      #pragma omp atomic
35      b += omp_get_num_threads ();
36
37      #pragma omp for private (j)
38      for (i = 0; i < 10; i++)
39	for (j = 0; j < 5; j++)
40	  A[i][j].y.l[3][3] += 20;
41
42    }
43
44  for (i = 0; i < 10; i++)
45    for (j = 0; j < 5; j++)
46      if (A[i][j].y.l[3][3] != 10)
47	abort ();
48
49  if (a != 28)
50    abort ();
51
52  if (b != 28)
53    abort ();
54}
55
56main()
57{
58  parallel (1, 2);
59  return 0;
60}
61