testsuite/libgomp.c++/pr30703.C

Go to the documentation of this file.
00001 // PR c++/30703
00002 // { dg-do run }
00003 
00004 #include <omp.h>
00005 
00006 extern "C" void abort ();
00007 
00008 int ctor, cctor, dtor;
00009 
00010 struct A
00011 {
00012   A();
00013   A(const A &);
00014   ~A();
00015   int i;
00016 };
00017 
00018 A::A()
00019 {
00020 #pragma omp atomic
00021   ctor++;
00022 }
00023 
00024 A::A(const A &r)
00025 {
00026   i = r.i;
00027 #pragma omp atomic
00028   cctor++;
00029 }
00030 
00031 A::~A()
00032 {
00033 #pragma omp atomic
00034   dtor++;
00035 }
00036 
00037 void
00038 foo (A a, A b)
00039 {
00040   int i, j = 0;
00041 #pragma omp parallel for firstprivate (a) lastprivate (a) private (b) schedule (static, 1) num_threads (5)
00042   for (i = 0; i < 5; i++)
00043     {
00044       b.i = 5;
00045       if (a.i != 6)
00046     #pragma omp atomic
00047       j += 1;
00048       a.i = b.i + i + 6;
00049     }
00050 
00051   if (j || a.i != 15)
00052     abort ();
00053 }
00054 
00055 void
00056 bar ()
00057 {
00058   A a, b;
00059   a.i = 6;
00060   b.i = 7;
00061   foo (a, b);
00062 }
00063 
00064 int
00065 main ()
00066 {
00067   omp_set_dynamic (false);
00068   if (ctor || cctor || dtor)
00069     abort ();
00070   bar ();
00071   if (ctor + cctor != dtor)
00072     abort ();
00073 }

Generated on Fri Apr 5 05:38:10 2013 for Libgomp by  doxygen 1.4.7