// PR c++/108180 // { dg-do run } struct A { A () { ++a; } A (A &&) = delete; A (const A &) { ++a; } A &operator= (const A &) = delete; A &operator= (A &&) = delete; ~A () { --a; } static int a; }; int A::a = 0; struct B { A a; template int foo () { int res = 0; #pragma omp parallel for if(false) firstprivate(a) for (int i = 0; i < 64; ++i) res += i; return res; } int bar () { int res = 0; #pragma omp parallel for if(false) firstprivate(a) for (int i = 0; i < 64; ++i) res += i; return res; } }; int main () { { B b; if (b.foo<0> () != 2016) __builtin_abort (); } if (A::a != 0) __builtin_abort (); { B b; if (b.bar () != 2016) __builtin_abort (); } if (A::a != 0) __builtin_abort (); }