2006-05-02 12:44:55 +02:00
|
|
|
// 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++)
|
2006-05-02 22:03:38 +02:00
|
|
|
ret.i += omp_get_thread_num ();
|
2006-05-02 12:44:55 +02:00
|
|
|
|
|
|
|
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;
|
|
|
|
}
|