259 lines · cpp
1// RUN: %clang_cc1 -verify -Wno-vla -fopenmp -ast-print %s | FileCheck %s2// RUN: %clang_cc1 -verify -Wno-vla -fopenmp -fopenmp-version=60 -DOMP60 -ast-print %s | FileCheck %s --check-prefix=CHECK603// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s4// RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -verify -Wno-vla %s -ast-print | FileCheck %s5 6// RUN: %clang_cc1 -verify -Wno-vla -fopenmp-simd -ast-print %s | FileCheck %s7// RUN: %clang_cc1 -verify -Wno-vla -fopenmp-simd -fopenmp-version=60 -DOMP60 -ast-print %s | FileCheck %s --check-prefix=CHECK608// RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -emit-pch -o %t %s9// RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t -verify -Wno-vla %s -ast-print | FileCheck %s10// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -ast-dump %s | FileCheck %s --check-prefix=DUMP11// expected-no-diagnostics12 13#ifndef HEADER14#define HEADER15 16typedef void *omp_depend_t;17typedef unsigned long omp_event_handle_t;18 19void foo() {}20 21struct S1 {22 S1(): a(0) {}23 S1(int v) : a(v) {}24 int a;25 typedef int type;26 S1 operator +(const S1&);27};28 29template <typename T>30class S7 : public T {31protected:32 T a, b, c[10], d[10];33 S7() : a(0) {}34 35public:36 S7(typename T::type v) : a(v) {37 omp_depend_t x;38 omp_event_handle_t evt;39#pragma omp taskgroup allocate(b) task_reduction(+:b)40#pragma omp task private(a) private(this->a) private(T::a) in_reduction(+:this->b) allocate(b) depend(depobj:x) detach(evt) depend(iterator(i=0:10:1, T *k = &a:&b), in: c[i], d[(int)(k-&a)]) affinity(iterator(i=0:10:1, T *k = &a:&b): c[i], d[(int)(k-&a)])41 for (int k = 0; k < a.a; ++k)42 ++this->a.a;43 }44 S7 &operator=(S7 &s) {45#pragma omp task private(a) private(this->a)46 for (int k = 0; k < s.a.a; ++k)47 ++s.a.a;48 return *this;49 }50};51 52// CHECK: #pragma omp taskgroup allocate(this->b) task_reduction(+: this->b)53// CHECK: #pragma omp task private(this->a) private(this->a) private(T::a) in_reduction(+: this->b) allocate(this->b) depend(depobj : x) detach(evt) depend(iterator(int i = 0:10:1, T * k = &this->a:&this->b), in : this->c[i],this->d[(int)(k - &this->a)]) affinity(iterator(int i = 0:10:1, T * k = &this->a:&this->b) : this->c[i],this->d[(int)(k - &this->a)]){{$}}54// CHECK: #pragma omp task private(this->a) private(this->a)55// CHECK: #pragma omp task private(this->a) private(this->a) private(this->S1::a) in_reduction(+: this->b) allocate(this->b) depend(depobj : x) detach(evt) depend(iterator(int i = 0:10:1, S1 * k = &this->a:&this->b), in : this->c[i],this->d[(int)(k - &this->a)]) affinity(iterator(int i = 0:10:1, S1 * k = &this->a:&this->b) : this->c[i],this->d[(int)(k - &this->a)])56 57class S8 : public S7<S1> {58 S8() {}59 60public:61 S8(int v) : S7<S1>(v){62#pragma omp task private(a) private(this->a) private(S7<S1>::a)63 for (int k = 0; k < a.a; ++k)64 ++this->a.a;65 }66 S8 &operator=(S8 &s) {67#pragma omp task private(a) private(this->a)68 for (int k = 0; k < s.a.a; ++k)69 ++s.a.a;70 return *this;71 }72};73 74// CHECK: #pragma omp task private(this->a) private(this->a) private(this->S7<S1>::a)75// CHECK: #pragma omp task private(this->a) private(this->a)76 77template <class T>78struct S {79 operator T() { return T(); }80 static T TS;81#pragma omp threadprivate(TS)82};83 84// CHECK: template <class T> struct S {85// CHECK: static T TS;86// CHECK-NEXT: #pragma omp threadprivate(S::TS)87// CHECK: };88// CHECK: template<> struct S<int> {89// CHECK: static int TS;90// CHECK-NEXT: #pragma omp threadprivate(S<int>::TS)91// CHECK-NEXT: }92 93template <typename T, int C>94T tmain(T argc, T *argv) {95 T b = argc, c, d, e, f, g;96 static T a;97 S<T> s;98 T arr[argc];99 omp_depend_t x;100 omp_event_handle_t evt;101 double *arr_double;102#pragma omp task untied depend(in : argc, argv[b:argc], arr[:], ([argc][sizeof(T)])argv, arr_double[argc]) if (task : argc > 0) depend(depobj: x) detach(evt)103 a = 2;104#pragma omp task default(none), private(argc, b) firstprivate(argv) shared(d) if (argc > 0) final(S<T>::TS > 0) priority(argc) affinity(argc, argv[b:argc], arr[:], ([argc][sizeof(T)])argv)105 foo();106#pragma omp taskgroup task_reduction(+: argc)107#pragma omp task if (C) mergeable priority(C) in_reduction(+: argc)108 foo();109 return 0;110}111 112// CHECK: template <typename T, int C> T tmain(T argc, T *argv) {113// CHECK-NEXT: T b = argc, c, d, e, f, g;114// CHECK-NEXT: static T a;115// CHECK-NEXT: S<T> s;116// CHECK-NEXT: T arr[argc];117// CHECK-NEXT: omp_depend_t x;118// CHECK-NEXT: omp_event_handle_t evt;119// CHECK-NEXT: double *arr_double;120// CHECK-NEXT: #pragma omp task untied depend(in : argc,argv[b:argc],arr[:],([argc][sizeof(T)])argv,arr_double[argc]) if(task: argc > 0) depend(depobj : x) detach(evt)121// CHECK-NEXT: a = 2;122// CHECK-NEXT: #pragma omp task default(none) private(argc,b) firstprivate(argv) shared(d) if(argc > 0) final(S<T>::TS > 0) priority(argc) affinity(argc,argv[b:argc],arr[:],([argc][sizeof(T)])argv)123// CHECK-NEXT: foo()124// CHECK-NEXT: #pragma omp taskgroup task_reduction(+: argc)125// CHECK-NEXT: #pragma omp task if(C) mergeable priority(C) in_reduction(+: argc)126// CHECK-NEXT: foo()127// CHECK: template<> int tmain<int, 5>(int argc, int *argv) {128// CHECK-NEXT: int b = argc, c, d, e, f, g;129// CHECK-NEXT: static int a;130// CHECK-NEXT: S<int> s;131// CHECK-NEXT: int arr[argc];132// CHECK-NEXT: omp_depend_t x;133// CHECK-NEXT: omp_event_handle_t evt;134// CHECK-NEXT: double *arr_double;135// CHECK-NEXT: #pragma omp task untied depend(in : argc,argv[b:argc],arr[:],([argc][sizeof(int)])argv,arr_double[argc]) if(task: argc > 0) depend(depobj : x) detach(evt)136// CHECK-NEXT: a = 2;137// CHECK-NEXT: #pragma omp task default(none) private(argc,b) firstprivate(argv) shared(d) if(argc > 0) final(S<int>::TS > 0) priority(argc) affinity(argc,argv[b:argc],arr[:],([argc][sizeof(int)])argv)138// CHECK-NEXT: foo()139// CHECK-NEXT: #pragma omp taskgroup task_reduction(+: argc)140// CHECK-NEXT: #pragma omp task if(5) mergeable priority(5) in_reduction(+: argc)141// CHECK-NEXT: foo()142// CHECK: template<> long tmain<long, 1>(long argc, long *argv) {143// CHECK-NEXT: long b = argc, c, d, e, f, g;144// CHECK-NEXT: static long a;145// CHECK-NEXT: S<long> s;146// CHECK-NEXT: long arr[argc];147// CHECK-NEXT: omp_depend_t x;148// CHECK-NEXT: omp_event_handle_t evt;149// CHECK-NEXT: double *arr_double;150// CHECK-NEXT: #pragma omp task untied depend(in : argc,argv[b:argc],arr[:],([argc][sizeof(long)])argv,arr_double[argc]) if(task: argc > 0) depend(depobj : x) detach(evt)151// CHECK-NEXT: a = 2;152// CHECK-NEXT: #pragma omp task default(none) private(argc,b) firstprivate(argv) shared(d) if(argc > 0) final(S<long>::TS > 0) priority(argc) affinity(argc,argv[b:argc],arr[:],([argc][sizeof(long)])argv)153// CHECK-NEXT: foo()154// CHECK-NEXT: #pragma omp taskgroup task_reduction(+: argc)155// CHECK-NEXT: #pragma omp task if(1) mergeable priority(1) in_reduction(+: argc)156// CHECK-NEXT: foo()157 158enum Enum {};159 160int main(int argc, char **argv) {161 long x;162 int b = argc, c, d, e, f, g;163 static int a;164 int arr[10], arr1[argc];165 omp_depend_t y;166 omp_event_handle_t evt;167#pragma omp threadprivate(a)168 Enum ee;169// CHECK: Enum ee;170#pragma omp task untied mergeable depend(out:argv[:a][1], (arr)[0:],([argc][10])argv,b) if(task: argc > 0) priority(f) depend(depobj:y)171 // CHECK-NEXT: #pragma omp task untied mergeable depend(out : argv[:a][1],(arr)[0:],([argc][10])argv,b) if(task: argc > 0) priority(f) depend(depobj : y)172 a = 2;173// CHECK-NEXT: a = 2;174#pragma omp taskgroup task_reduction(min: arr1)175#pragma omp task default(none), private(argc, b) firstprivate(argv, evt) if (argc > 0) final(a > 0) depend(inout : a, argv[:argc],arr[:a], ([10][argc])argv) priority(23) in_reduction(min: arr1), detach(evt)176 // CHECK-NEXT: #pragma omp taskgroup task_reduction(min: arr1)177 // CHECK-NEXT: #pragma omp task default(none) private(argc,b) firstprivate(argv,evt) if(argc > 0) final(a > 0) depend(inout : a,argv[:argc],arr[:a],([10][argc])argv) priority(23) in_reduction(min: arr1) detach(evt)178 foo();179 // CHECK-NEXT: foo();180#pragma omp taskgroup task_reduction(min: arr1)181#pragma omp parallel reduction(+:arr1)182#pragma omp task in_reduction(min: arr1) depend(iterator(i=0:argc, unsigned j=argc:0:a), out: argv[i][j])183 // CHECK-NEXT: #pragma omp taskgroup task_reduction(min: arr1)184 // CHECK-NEXT: #pragma omp parallel reduction(+: arr1)185 // CHECK-NEXT: #pragma omp task in_reduction(min: arr1) depend(iterator(int i = 0:argc, unsigned int j = argc:0:a), out : argv[i][j])186 foo();187 // CHECK-NEXT: foo();188 // CHECK-NEXT: #pragma omp task in_reduction(+: arr1)189#pragma omp task in_reduction(+: arr1)190 foo();191 // CHECK-NEXT: foo();192 // CHECK-NEXT: #pragma omp task depend(out : arr,omp_all_memory)193#pragma omp task depend(out: omp_all_memory, arr)194 foo();195 // CHECK-NEXT: foo();196 // CHECK-NEXT: #pragma omp task depend(inout : b,arr,a,x,omp_all_memory)197#pragma omp task depend(inout: b, arr, omp_all_memory, a, x)198 foo();199 // CHECK-NEXT: foo();200 // CHECK-NEXT: #pragma omp task depend(inout : omp_all_memory)201#pragma omp task depend(inout: omp_all_memory)202 foo();203 // CHECK-NEXT: foo();204#ifdef OMP60205#pragma omp task threadset(omp_pool)206#pragma omp task threadset(omp_team)207 foo();208#endif209 // CHECK60: #pragma omp task threadset(omp_pool)210 // CHECK60: #pragma omp task threadset(omp_team)211 // CHECK60-NEXT: foo();212 return tmain<int, 5>(b, &b) + tmain<long, 1>(x, &x);213}214 215extern template int S<int>::TS;216extern template long S<long>::TS;217 218// DUMP-LABEL: FunctionDecl {{.*}} implicit_firstprivate219void220implicit_firstprivate() {221 222#pragma omp parallel num_threads(1)223 {224 int i = 0;225 // DUMP: OMPTaskDirective 226 // DUMP-NEXT: OMPFirstprivateClause227 // DUMP-NOT: DeclRefExpr {{.+}} 'i' {{.+}} non_odr_use_unevaluated228 // DUMP: DeclRefExpr {{.+}} 'i' 'int' refers_to_enclosing_variable_or_capture229 // DUMP: CapturedStmt230 // DUMP: BinaryOperator {{.+}} 'int' lvalue '='231 // DUMP-NEXT: DeclRefExpr {{.+}} 'j' 'int'232 // DUMP: DeclRefExpr {{.+}} 'i' {{.+}} non_odr_use_unevaluated233 #pragma omp task234 {235 int j = sizeof(i);236 j = i;237 }238 }239}240 241// DUMP-LABEL: FunctionDecl {{.*}} no_implicit_firstprivate242void243no_implicit_firstprivate() {244 245#pragma omp parallel num_threads(1)246 {247 int i = 0;248 // DUMP: OMPTaskDirective249 // DUMP-NEXT: CapturedStmt250 // DUMP: DeclRefExpr {{.+}} 'i' {{.+}} non_odr_use_unevaluated refers_to_enclosing_variable_or_capture251 #pragma omp task252 {253 int j = sizeof(i);254 }255 }256}257 258#endif259