123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- // PR middle-end/27337
- // { dg-do run }
- #include <omp.h>
- extern "C" void abort (void);
- struct S
- {
- S ();
- ~S ();
- S (const S &);
- int i;
- };
- int n[3];
- S::S () : i(18)
- {
- if (omp_get_thread_num () != 0)
- #pragma omp atomic
- n[0]++;
- }
- S::~S ()
- {
- if (omp_get_thread_num () != 0)
- #pragma omp atomic
- n[1]++;
- }
- S::S (const S &x)
- {
- if (x.i != 18)
- abort ();
- i = 118;
- if (omp_get_thread_num () != 0)
- #pragma omp atomic
- n[2]++;
- }
- S
- foo ()
- {
- int i;
- S ret;
- #pragma omp parallel for firstprivate (ret) lastprivate (ret) \
- schedule (static, 1) num_threads (4)
- for (i = 0; i < 4; i++)
- ret.i += omp_get_thread_num ();
- return ret;
- }
- S
- bar ()
- {
- int i;
- S ret;
- #pragma omp parallel for num_threads (4)
- for (i = 0; i < 4; i++)
- #pragma omp atomic
- ret.i += omp_get_thread_num () + 1;
- return ret;
- }
- S x;
- int
- main (void)
- {
- omp_set_dynamic (false);
- x = foo ();
- if (n[0] != 0 || n[1] != 3 || n[2] != 3)
- abort ();
- if (x.i != 118 + 3)
- abort ();
- x = bar ();
- if (n[0] != 0 || n[1] != 3 || n[2] != 3)
- abort ();
- if (x.i != 18 + 0 + 1 + 2 + 3 + 4)
- abort ();
- return 0;
- }
|