testsuite/libgomp.c++/task-3.C

Go to the documentation of this file.
00001 // { dg-do run }
00002 
00003 extern "C" void abort ();
00004 
00005 struct A
00006 {
00007   A ();
00008   ~A ();
00009   A (const A &);
00010   unsigned long l;
00011 };
00012 
00013 int e;
00014 
00015 A::A ()
00016 {
00017   l = 17;
00018 }
00019 
00020 A::~A ()
00021 {
00022   if (l > 30)
00023     #pragma omp atomic
00024       e++;
00025 }
00026 
00027 A::A (const A &r)
00028 {
00029   l = r.l;
00030 }
00031 
00032 void
00033 check (int i, A &a, int j, A &b)
00034 {
00035   if (i != 6 || a.l != 21 || j != 0 || b.l != 23)
00036     #pragma omp atomic
00037       e++;
00038 }
00039 
00040 A b;
00041 int j;
00042 
00043 void
00044 foo (int i)
00045 {
00046   A a;
00047   a.l = 21;
00048   #pragma omp task firstprivate (i, a, j, b)
00049     check (i, a, j, b);
00050 }
00051 
00052 void
00053 bar (int i, A a)
00054 {
00055   a.l = 21;
00056   #pragma omp task firstprivate (i, a, j, b)
00057     check (i, a, j, b);
00058 }
00059 
00060 A
00061 baz ()
00062 {
00063   A a, c;
00064   a.l = 21;
00065   c.l = 23;
00066   #pragma omp task firstprivate (a, c)
00067     check (6, a, 0, c);
00068   return a;
00069 }
00070 
00071 int
00072 main ()
00073 {
00074   b.l = 23;
00075   foo (6);
00076   bar (6, A ());
00077   baz ();
00078   #pragma omp parallel num_threads (4)
00079     {
00080       #pragma omp single
00081     for (int i = 0; i < 64; i++)
00082       {
00083         foo (6);
00084         bar (6, A ());
00085         baz ();
00086       }
00087     }
00088   if (e)
00089     abort ();
00090 }

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