00001
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 }