// 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 (); }