1 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -ast-print %s | FileCheck %s 2 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s 3 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s 4 // expected-no-diagnostics 5 6 #ifndef HEADER 7 #define HEADER 8 9 void foo() {} 10 11 struct S1 { 12 S1(): a(0) {} 13 S1(int v) : a(v) {} 14 int a; 15 typedef int type; 16 S1 operator +(const S1&); 17 }; 18 19 template <typename T> 20 class S7 : public T { 21 protected: 22 T a, b; 23 S7() : a(0) {} 24 25 public: 26 S7(typename T::type v) : a(v) { 27 #pragma omp taskgroup task_reduction(+:b) 28 #pragma omp task private(a) private(this->a) private(T::a) in_reduction(+:this->b) 29 for (int k = 0; k < a.a; ++k) 30 ++this->a.a; 31 } 32 S7 &operator=(S7 &s) { 33 #pragma omp task private(a) private(this->a) 34 for (int k = 0; k < s.a.a; ++k) 35 ++s.a.a; 36 return *this; 37 } 38 }; 39 40 // CHECK: #pragma omp taskgroup task_reduction(+: this->b) 41 // CHECK: #pragma omp task private(this->a) private(this->a) private(T::a) in_reduction(+: this->b) 42 // CHECK: #pragma omp task private(this->a) private(this->a) 43 // CHECK: #pragma omp task private(this->a) private(this->a) private(this->S1::a) 44 45 class S8 : public S7<S1> { 46 S8() {} 47 48 public: 49 S8(int v) : S7<S1>(v){ 50 #pragma omp task private(a) private(this->a) private(S7<S1>::a) 51 for (int k = 0; k < a.a; ++k) 52 ++this->a.a; 53 } 54 S8 &operator=(S8 &s) { 55 #pragma omp task private(a) private(this->a) 56 for (int k = 0; k < s.a.a; ++k) 57 ++s.a.a; 58 return *this; 59 } 60 }; 61 62 // CHECK: #pragma omp task private(this->a) private(this->a) private(this->S7<S1>::a) 63 // CHECK: #pragma omp task private(this->a) private(this->a) 64 65 template <class T> 66 struct S { 67 operator T() { return T(); } 68 static T TS; 69 #pragma omp threadprivate(TS) 70 }; 71 72 // CHECK: template <class T> struct S { 73 // CHECK: static T TS; 74 // CHECK-NEXT: #pragma omp threadprivate(S::TS) 75 // CHECK: }; 76 // CHECK: template<> struct S<int> { 77 // CHECK: static int TS; 78 // CHECK-NEXT: #pragma omp threadprivate(S<int>::TS) 79 // CHECK-NEXT: } 80 // CHECK: template<> struct S<long> { 81 // CHECK: static long TS; 82 // CHECK-NEXT: #pragma omp threadprivate(S<long>::TS) 83 // CHECK-NEXT: } 84 85 template <typename T, int C> 86 T tmain(T argc, T *argv) { 87 T b = argc, c, d, e, f, g; 88 static T a; 89 S<T> s; 90 T arr[argc]; 91 #pragma omp task untied depend(in : argc, argv[b:argc], arr[:]) if (task : argc > 0) 92 a = 2; 93 #pragma omp task default(none), private(argc, b) firstprivate(argv) shared(d) if (argc > 0) final(S<T>::TS > 0) priority(argc) 94 foo(); 95 #pragma omp taskgroup task_reduction(-: argc) 96 #pragma omp task if (C) mergeable priority(C) in_reduction(-: argc) 97 foo(); 98 return 0; 99 } 100 101 // CHECK: template <typename T, int C> T tmain(T argc, T *argv) { 102 // CHECK-NEXT: T b = argc, c, d, e, f, g; 103 // CHECK-NEXT: static T a; 104 // CHECK-NEXT: S<T> s; 105 // CHECK-NEXT: T arr[argc]; 106 // CHECK-NEXT: #pragma omp task untied depend(in : argc,argv[b:argc],arr[:]) if(task: argc > 0) 107 // CHECK-NEXT: a = 2; 108 // CHECK-NEXT: #pragma omp task default(none) private(argc,b) firstprivate(argv) shared(d) if(argc > 0) final(S<T>::TS > 0) priority(argc) 109 // CHECK-NEXT: foo() 110 // CHECK-NEXT: #pragma omp taskgroup task_reduction(-: argc) 111 // CHECK-NEXT: #pragma omp task if(C) mergeable priority(C) in_reduction(-: argc) 112 // CHECK-NEXT: foo() 113 // CHECK: template<> int tmain<int, 5>(int argc, int *argv) { 114 // CHECK-NEXT: int b = argc, c, d, e, f, g; 115 // CHECK-NEXT: static int a; 116 // CHECK-NEXT: S<int> s; 117 // CHECK-NEXT: int arr[argc]; 118 // CHECK-NEXT: #pragma omp task untied depend(in : argc,argv[b:argc],arr[:]) if(task: argc > 0) 119 // CHECK-NEXT: a = 2; 120 // CHECK-NEXT: #pragma omp task default(none) private(argc,b) firstprivate(argv) shared(d) if(argc > 0) final(S<int>::TS > 0) priority(argc) 121 // CHECK-NEXT: foo() 122 // CHECK-NEXT: #pragma omp taskgroup task_reduction(-: argc) 123 // CHECK-NEXT: #pragma omp task if(5) mergeable priority(5) in_reduction(-: argc) 124 // CHECK-NEXT: foo() 125 // CHECK: template<> long tmain<long, 1>(long argc, long *argv) { 126 // CHECK-NEXT: long b = argc, c, d, e, f, g; 127 // CHECK-NEXT: static long a; 128 // CHECK-NEXT: S<long> s; 129 // CHECK-NEXT: long arr[argc]; 130 // CHECK-NEXT: #pragma omp task untied depend(in : argc,argv[b:argc],arr[:]) if(task: argc > 0) 131 // CHECK-NEXT: a = 2; 132 // CHECK-NEXT: #pragma omp task default(none) private(argc,b) firstprivate(argv) shared(d) if(argc > 0) final(S<long>::TS > 0) priority(argc) 133 // CHECK-NEXT: foo() 134 // CHECK-NEXT: #pragma omp taskgroup task_reduction(-: argc) 135 // CHECK-NEXT: #pragma omp task if(1) mergeable priority(1) in_reduction(-: argc) 136 // CHECK-NEXT: foo() 137 138 enum Enum {}; 139 140 int main(int argc, char **argv) { 141 long x; 142 int b = argc, c, d, e, f, g; 143 static int a; 144 int arr[10], arr1[argc]; 145 #pragma omp threadprivate(a) 146 Enum ee; 147 // CHECK: Enum ee; 148 #pragma omp task untied mergeable depend(out:argv[:a][1], (arr)[0:]) if(task: argc > 0) priority(f) 149 // CHECK-NEXT: #pragma omp task untied mergeable depend(out : argv[:a][1],(arr)[0:]) if(task: argc > 0) priority(f) 150 a = 2; 151 // CHECK-NEXT: a = 2; 152 #pragma omp taskgroup task_reduction(min: arr1) 153 #pragma omp task default(none), private(argc, b) firstprivate(argv) if (argc > 0) final(a > 0) depend(inout : a, argv[:argc],arr[:a]) priority(23) in_reduction(min: arr1) 154 // CHECK-NEXT: #pragma omp taskgroup task_reduction(min: arr1) 155 // CHECK-NEXT: #pragma omp task default(none) private(argc,b) firstprivate(argv) if(argc > 0) final(a > 0) depend(inout : a,argv[:argc],arr[:a]) priority(23) in_reduction(min: arr1) 156 foo(); 157 // CHECK-NEXT: foo(); 158 #pragma omp taskgroup task_reduction(min: arr1) 159 #pragma omp parallel reduction(+:arr1) 160 #pragma omp task in_reduction(min: arr1) 161 // CHECK-NEXT: #pragma omp taskgroup task_reduction(min: arr1) 162 // CHECK-NEXT: #pragma omp parallel reduction(+: arr1) 163 // CHECK-NEXT: #pragma omp task in_reduction(min: arr1) 164 foo(); 165 // CHECK-NEXT: foo(); 166 return tmain<int, 5>(b, &b) + tmain<long, 1>(x, &x); 167 } 168 169 extern template int S<int>::TS; 170 extern template long S<long>::TS; 171 172 #endif 173