xref: /openbsd-src/gnu/gcc/libgomp/testsuite/libgomp.c++/pr27337.C (revision 404b540a9034ac75a6199ad1a32d1bbc7a0d4210)
1*404b540aSrobert // PR middle-end/27337
2*404b540aSrobert // { dg-do run }
3*404b540aSrobert 
4*404b540aSrobert #include <omp.h>
5*404b540aSrobert 
6*404b540aSrobert extern "C" void abort (void);
7*404b540aSrobert 
8*404b540aSrobert struct S
9*404b540aSrobert {
10*404b540aSrobert   S ();
11*404b540aSrobert   ~S ();
12*404b540aSrobert   S (const S &);
13*404b540aSrobert   int i;
14*404b540aSrobert };
15*404b540aSrobert 
16*404b540aSrobert int n[3];
17*404b540aSrobert 
S()18*404b540aSrobert S::S () : i(18)
19*404b540aSrobert {
20*404b540aSrobert   if (omp_get_thread_num () != 0)
21*404b540aSrobert #pragma omp atomic
22*404b540aSrobert     n[0]++;
23*404b540aSrobert }
24*404b540aSrobert 
~S()25*404b540aSrobert S::~S ()
26*404b540aSrobert {
27*404b540aSrobert   if (omp_get_thread_num () != 0)
28*404b540aSrobert #pragma omp atomic
29*404b540aSrobert     n[1]++;
30*404b540aSrobert }
31*404b540aSrobert 
S(const S & x)32*404b540aSrobert S::S (const S &x)
33*404b540aSrobert {
34*404b540aSrobert   if (x.i != 18)
35*404b540aSrobert     abort ();
36*404b540aSrobert   i = 118;
37*404b540aSrobert   if (omp_get_thread_num () != 0)
38*404b540aSrobert #pragma omp atomic
39*404b540aSrobert     n[2]++;
40*404b540aSrobert }
41*404b540aSrobert 
42*404b540aSrobert S
foo()43*404b540aSrobert foo ()
44*404b540aSrobert {
45*404b540aSrobert   int i;
46*404b540aSrobert   S ret;
47*404b540aSrobert 
48*404b540aSrobert #pragma omp parallel for firstprivate (ret) lastprivate (ret) \
49*404b540aSrobert 			 schedule (static, 1) num_threads (4)
50*404b540aSrobert   for (i = 0; i < 4; i++)
51*404b540aSrobert     ret.i += omp_get_thread_num ();
52*404b540aSrobert 
53*404b540aSrobert   return ret;
54*404b540aSrobert }
55*404b540aSrobert 
56*404b540aSrobert S
bar()57*404b540aSrobert bar ()
58*404b540aSrobert {
59*404b540aSrobert   int i;
60*404b540aSrobert   S ret;
61*404b540aSrobert 
62*404b540aSrobert #pragma omp parallel for num_threads (4)
63*404b540aSrobert   for (i = 0; i < 4; i++)
64*404b540aSrobert #pragma omp atomic
65*404b540aSrobert     ret.i += omp_get_thread_num () + 1;
66*404b540aSrobert 
67*404b540aSrobert   return ret;
68*404b540aSrobert }
69*404b540aSrobert 
70*404b540aSrobert S x;
71*404b540aSrobert 
72*404b540aSrobert int
main(void)73*404b540aSrobert main (void)
74*404b540aSrobert {
75*404b540aSrobert   omp_set_dynamic (false);
76*404b540aSrobert   x = foo ();
77*404b540aSrobert   if (n[0] != 0 || n[1] != 3 || n[2] != 3)
78*404b540aSrobert     abort ();
79*404b540aSrobert   if (x.i != 118 + 3)
80*404b540aSrobert     abort ();
81*404b540aSrobert   x = bar ();
82*404b540aSrobert   if (n[0] != 0 || n[1] != 3 || n[2] != 3)
83*404b540aSrobert     abort ();
84*404b540aSrobert   if (x.i != 18 + 0 + 1 + 2 + 3 + 4)
85*404b540aSrobert     abort ();
86*404b540aSrobert   return 0;
87*404b540aSrobert }
88