mirror of
https://github.com/autc04/Retro68.git
synced 2024-12-02 03:50:17 +00:00
121 lines
1.5 KiB
C
121 lines
1.5 KiB
C
// PR c++/93931
|
|
// { dg-do run }
|
|
// { dg-options "-O2 -std=c++14" }
|
|
|
|
extern "C" void abort ();
|
|
|
|
void
|
|
sink (int &x)
|
|
{
|
|
int *volatile p;
|
|
p = &x;
|
|
(*p)++;
|
|
}
|
|
|
|
int
|
|
foo ()
|
|
{
|
|
int r = 0;
|
|
[&r] () {
|
|
#pragma omp parallel for reduction(+ : r)
|
|
for (int i = 0; i < 1024; ++i)
|
|
r += i;
|
|
} ();
|
|
return r;
|
|
}
|
|
|
|
int
|
|
bar ()
|
|
{
|
|
int l = 0;
|
|
[&l] () {
|
|
#pragma omp parallel for lastprivate (l)
|
|
for (int i = 0; i < 1024; ++i)
|
|
l = i;
|
|
} ();
|
|
return l;
|
|
}
|
|
|
|
void
|
|
baz ()
|
|
{
|
|
int f = 18;
|
|
[&f] () {
|
|
#pragma omp parallel for firstprivate (f)
|
|
for (int i = 0; i < 1024; ++i)
|
|
{
|
|
sink (f);
|
|
f += 3;
|
|
sink (f);
|
|
if (f != 23)
|
|
abort ();
|
|
sink (f);
|
|
f -= 7;
|
|
sink (f);
|
|
}
|
|
} ();
|
|
if (f != 18)
|
|
abort ();
|
|
}
|
|
|
|
int
|
|
qux ()
|
|
{
|
|
int r = 0;
|
|
[&] () {
|
|
#pragma omp parallel for reduction(+ : r)
|
|
for (int i = 0; i < 1024; ++i)
|
|
r += i;
|
|
} ();
|
|
return r;
|
|
}
|
|
|
|
int
|
|
corge ()
|
|
{
|
|
int l = 0;
|
|
[&] () {
|
|
#pragma omp parallel for lastprivate (l)
|
|
for (int i = 0; i < 1024; ++i)
|
|
l = i;
|
|
} ();
|
|
return l;
|
|
}
|
|
|
|
void
|
|
garply ()
|
|
{
|
|
int f = 18;
|
|
[&] () {
|
|
#pragma omp parallel for firstprivate (f)
|
|
for (int i = 0; i < 1024; ++i)
|
|
{
|
|
sink (f);
|
|
f += 3;
|
|
sink (f);
|
|
if (f != 23)
|
|
abort ();
|
|
sink (f);
|
|
f -= 7;
|
|
sink (f);
|
|
}
|
|
} ();
|
|
if (f != 18)
|
|
abort ();
|
|
}
|
|
|
|
int
|
|
main ()
|
|
{
|
|
if (foo () != 1024 * 1023 / 2)
|
|
abort ();
|
|
if (bar () != 1023)
|
|
abort ();
|
|
baz ();
|
|
if (qux () != 1024 * 1023 / 2)
|
|
abort ();
|
|
if (corge () != 1023)
|
|
abort ();
|
|
garply ();
|
|
}
|