00001
00002
00003
00004 extern "C" void abort ();
00005
00006 static int n;
00007
00008 struct A
00009 {
00010 A ()
00011 {
00012 l = 0;
00013 #pragma omp atomic
00014 ctors++;
00015 }
00016 A (const A &x)
00017 {
00018 l = x.l;
00019 #pragma omp atomic
00020 copyctors++;
00021 }
00022 virtual A& operator= (const A &x)
00023 {
00024 l = x.l;
00025 #pragma omp atomic
00026 assignops++;
00027 return *this;
00028 }
00029 virtual ~A ()
00030 {
00031 #pragma omp atomic
00032 dtors++;
00033 }
00034 int l;
00035 static int ctors, dtors, copyctors, assignops;
00036 };
00037
00038 int A::ctors;
00039 int A::dtors;
00040 int A::copyctors;
00041 int A::assignops;
00042
00043 int
00044 main ()
00045 {
00046 A a;
00047 #pragma omp parallel private (a)
00048 {
00049 a.l = 6;
00050 #pragma omp single copyprivate (a)
00051 {
00052 a.l = 3;
00053 }
00054 if (a.l != 3)
00055 abort ();
00056 #pragma omp atomic
00057 n++;
00058 }
00059 if (A::ctors != n + 1
00060 || A::copyctors != 0
00061 || A::dtors != n
00062 || A::assignops != n - 1)
00063 abort ();
00064 return 0;
00065 }