C99 testsuite readiness: Compile more tests with -std=gnu89
[official-gcc.git] / gcc / testsuite / g++.dg / gomp / pr88586.C
blob2d1b47b92d8661d710b92233e2f898e0e5de3097
1 // PR ipa/88586
2 // { dg-do compile { target lto } }
3 // { dg-options "-fopenmp -flto" }
5 extern "C" int omp_get_cancellation ();
6 extern "C" int omp_get_thread_num ();
7 extern "C" void abort ();
9 struct A { A (); ~A (); A (const A &); static int cnt1, cnt2, cnt3; int a; };
10 int A::cnt1;
11 int A::cnt2;
12 int A::cnt3;
13 A::A () : a (0)
15   #pragma omp atomic
16   cnt1++;
18 A::A (const A &x) : a (x.a)
20   #pragma omp atomic
21   cnt2++;
23 A::~A ()
25   #pragma omp atomic
26   cnt3++;
28 #pragma omp declare reduction (+: A: omp_out.a += omp_in.a)
30 void
31 foo (int x)
33   A a, b[2];
34   int d = 1;
35   long int e[2] = { 1L, 1L };
36   int c = 0;
37   #pragma omp parallel
38   {
39     if (x && omp_get_thread_num () == 0)
40       {
41         for (int i = 0; i < 10000000; ++i)
42           asm volatile ("");
43         c = 1;
44         #pragma omp cancel parallel
45       }
46     #pragma omp for reduction (task, +: a, b) reduction (task, *: d, e)
47     for (int i = 0; i < 64; i++)
48       #pragma omp task in_reduction (+: a, b) in_reduction (*: d, e)
49       {
50         a.a++;
51         b[0].a += 2;
52         b[1].a += 3;
53         d *= ((i & 7) == 0) + 1;
54         e[0] *= ((i & 7) == 3) + 1;
55         e[1] *= ((i & 3) == 2) + 1;
56       }
57     if (x && omp_get_cancellation ())
58       abort ();
59   }
60   if (!c)
61     {
62       if (a.a != 64 || b[0].a != 128 || b[1].a != 192)
63         abort ();
64       if (d != 256 || e[0] != 256L || e[1] != 65536L)
65         abort ();
66     }
69 int
70 main ()
72   int c1 = A::cnt1, c2 = A::cnt2, c3 = A::cnt3;
73   volatile int zero = 0;
74   foo (zero);
75   if (A::cnt1 + A::cnt2 - c1 - c2 != A::cnt3 - c3)
76     abort ();