mirror of
https://github.com/autc04/Retro68.git
synced 2024-11-29 12:50:35 +00:00
88 lines
1.1 KiB
C++
88 lines
1.1 KiB
C++
|
// 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;
|
||
|
}
|