1 // PR c++/26943 2 // { dg-do run } 3 4 #include <assert.h> 5 #include <unistd.h> 6 7 struct S 8 { 9 public: 10 int x; SS11 S () : x(-1) { } 12 S (const S &); 13 S& operator= (const S &); 14 void test (); 15 }; 16 17 static volatile int hold; 18 S(const S & s)19S::S (const S &s) 20 { 21 #pragma omp master 22 sleep (1); 23 24 assert (s.x == -1); 25 x = 0; 26 } 27 28 S& 29 S::operator= (const S& s) 30 { 31 assert (s.x == 1); 32 x = 2; 33 return *this; 34 } 35 36 void test()37S::test () 38 { 39 assert (x == 0); 40 x = 1; 41 } 42 43 static S x; 44 45 void foo()46foo () 47 { 48 #pragma omp sections firstprivate(x) lastprivate(x) 49 { 50 x.test(); 51 } 52 } 53 54 int main()55main () 56 { 57 #pragma omp parallel num_threads(2) 58 foo(); 59 60 assert (x.x == 2); 61 return 0; 62 } 63