00001 extern "C" void abort (); 00002 00003 int a = 18; 00004 00005 template <typename T> 00006 void 00007 f1 (T i, T j, T k) 00008 { 00009 T l = 6, m = 7, n = 8; 00010 #pragma omp task private(j, m) shared(k, n) 00011 { 00012 j = 6; 00013 m = 5; 00014 if (++a != 19 || ++i != 9 || j != 6 || ++l != 7 || m != 5 || ++n != 9) 00015 #pragma omp atomic 00016 k++; 00017 } 00018 #pragma omp taskwait 00019 if (a != 19 || i != 8 || j != 26 || k != 0 || l != 6 || m != 7 || n != 9) 00020 abort (); 00021 } 00022 00023 int v1 = 1, v2 = 2, v5 = 5; 00024 int e; 00025 00026 template <typename T> 00027 void 00028 f2 (void) 00029 { 00030 T v3 = 3; 00031 #pragma omp sections private (v1) firstprivate (v2) 00032 { 00033 #pragma omp section 00034 { 00035 T v4 = 4; 00036 v1 = 7; 00037 #pragma omp task 00038 { 00039 if (++v1 != 8 || ++v2 != 3 || ++v3 != 4 || ++v4 != 5 || ++v5 != 6) 00040 e = 1; 00041 } 00042 #pragma omp taskwait 00043 if (v1 != 7 || v2 != 2 || v3 != 3 || v4 != 4 || v5 != 6) 00044 abort (); 00045 if (e) 00046 abort (); 00047 } 00048 } 00049 } 00050 00051 template <typename T> 00052 void 00053 f3 (T i, T j, T k) 00054 { 00055 T l = 6, m = 7, n = 8; 00056 #pragma omp task private(j, m) shared(k, n) untied 00057 { 00058 j = 6; 00059 m = 5; 00060 if (++a != 19 || ++i != 9 || j != 6 || ++l != 7 || m != 5 || ++n != 9) 00061 #pragma omp atomic 00062 k++; 00063 } 00064 #pragma omp taskwait 00065 if (a != 19 || i != 8 || j != 26 || k != 0 || l != 6 || m != 7 || n != 9) 00066 abort (); 00067 } 00068 00069 int 00070 main () 00071 { 00072 f1 <int> (8, 26, 0); 00073 f2 <int> (); 00074 a = 18; 00075 f3 <int> (8, 26, 0); 00076 a = 18; 00077 #pragma omp parallel num_threads(4) 00078 { 00079 #pragma omp master 00080 { 00081 f1 <int> (8, 26, 0); 00082 a = 18; 00083 f3 <int> (8, 26, 0); 00084 } 00085 } 00086 }