[testsuite] Require c99_runtime for pr79800.c
[official-gcc.git] / libgomp / testsuite / libgomp.c++ / pr69555-1.C
blobc6885ff73213de77a3b2ca9e53c3e5ae8237e2d6
1 // PR libgomp/69555
2 // { dg-do run }
4 #include <omp.h>
6 __attribute__((noinline, noclone)) void
7 f1 (int y)
9   int a[y - 2];
10   int (&c)[y - 2] = a;
11   c[0] = 111;
12   int e = 0;
14   #pragma omp parallel private (c) num_threads (4) reduction (+:e)
15   {
16     int v = omp_get_thread_num ();
17     for (int i = 0; i < y - 2; i++)
18       c[i] = i + v;
19     #pragma omp barrier
20     for (int i = 0; i < y - 2; i++)
21       if (c[i] != i + v)
22         e++;
23   }
24   if (c[0] != 111 || e)
25     __builtin_abort ();
28 __attribute__((noinline, noclone)) void
29 f2 (int y)
31   int a[y - 2];
32   int (&c)[y - 2] = a;
33   c[0] = 111;
35   #pragma omp task private (c)
36   {
37     int v = omp_get_thread_num ();
38     for (int i = 0; i < y - 2; i++)
39       c[i] = i + v;
40     asm volatile ("" : : "r" (&c[0]) : "memory");
41     for (int i = 0; i < y - 2; i++)
42       if (c[i] != i + v)
43         __builtin_abort ();
44   }
45   if (c[0] != 111)
46     __builtin_abort ();
49 __attribute__((noinline, noclone)) void
50 f3 (int y)
52   int a[y - 2];
53   int (&c)[y - 2] = a;
54   for (int i = 0; i < y - 2; i++)
55     c[i] = i + 4;
57   #pragma omp parallel firstprivate (c) num_threads (4)
58   {
59     int v = omp_get_thread_num ();
60     for (int i = 0; i < y - 2; i++)
61       {
62         if (c[i] != i + 4)
63           __builtin_abort ();
64         c[i] = i + v;
65       }
66     #pragma omp barrier
67     for (int i = 0; i < y - 2; i++)
68       if (c[i] != i + v)
69         __builtin_abort ();
70   }
71   for (int i = 0; i < y - 2; i++)
72     if (c[i] != i + 4)
73       __builtin_abort ();
76 __attribute__((noinline, noclone)) void
77 f4 (int y)
79   int a[y - 2];
80   int (&c)[y - 2] = a;
81   for (int i = 0; i < y - 2; i++)
82     c[i] = i + 4;
84   #pragma omp task firstprivate (c)
85   {
86     int v = omp_get_thread_num ();
87     for (int i = 0; i < y - 2; i++)
88       {
89         if (c[i] != i + 4)
90           __builtin_abort ();
91         c[i] = i + v;
92       }
93     asm volatile ("" : : "r" (&c[0]) : "memory");
94     for (int i = 0; i < y - 2; i++)
95       if (c[i] != i + v)
96         __builtin_abort ();
97   }
98   for (int i = 0; i < y - 2; i++)
99     if (c[i] != i + 4)
100       __builtin_abort ();
104 main ()
106   f1 (6);
107   f3 (6);
108   #pragma omp parallel num_threads (4)
109   {
110     f2 (6);
111     f4 (6);
112   }
113   return 0;