341 lines · cpp
1// RUN: %clang_cc1 -verify -Wno-vla -fopenmp -fopenmp-version=50 -ast-print %s | FileCheck %s2// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s3// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -std=c++11 -include-pch %t -verify -Wno-vla %s -ast-print | FileCheck %s4 5// RUN: %clang_cc1 -verify -Wno-vla -fopenmp-simd -fopenmp-version=50 -ast-print %s | FileCheck %s6// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s7// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -std=c++11 -include-pch %t -verify -Wno-vla %s -ast-print | FileCheck %s8 9// RUN: %clang_cc1 -DOMP51 -verify -Wno-vla -fopenmp -ast-print %s | FileCheck -check-prefixes=CHECK,OMP51 %s10// RUN: %clang_cc1 -DOMP51 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s11// RUN: %clang_cc1 -DOMP51 -fopenmp -std=c++11 -include-pch %t -verify -Wno-vla %s -ast-print | FileCheck -check-prefixes=CHECK,OMP51 %s12 13// RUN: %clang_cc1 -DOMP51 -verify -Wno-vla -fopenmp-simd -ast-print %s | FileCheck -check-prefixes=CHECK,OMP51 %s14// RUN: %clang_cc1 -DOMP51 -fopenmp-simd -x c++ -std=c++11 -emit-pch -o %t %s15// RUN: %clang_cc1 -DOMP51 -fopenmp-simd -std=c++11 -include-pch %t -verify -Wno-vla %s -ast-print | FileCheck -check-prefixes=CHECK,OMP51 %s16 17// RUN: %clang_cc1 -DOMP60 -verify -Wno-vla -fopenmp -fopenmp-version=60 -ast-print %s | FileCheck -check-prefixes=CHECK,OMP60 %s18// RUN: %clang_cc1 -DOMP60 -fopenmp -fopenmp-version=60 -x c++ -std=c++11 -emit-pch -o %t %s19// RUN: %clang_cc1 -DOMP60 -fopenmp -fopenmp-version=60 -std=c++11 -include-pch %t -verify -Wno-vla %s -ast-print | FileCheck -check-prefixes=CHECK,OMP60 %s20 21// RUN: %clang_cc1 -DOMP60 -verify -Wno-vla -fopenmp-simd -fopenmp-version=60 -ast-print %s | FileCheck -check-prefixes=CHECK,OMP60 %s22// RUN: %clang_cc1 -DOMP60 -fopenmp-simd -fopenmp-version=60 -x c++ -std=c++11 -emit-pch -o %t %s23// RUN: %clang_cc1 -DOMP60 -fopenmp-simd -fopenmp-version=60 -std=c++11 -include-pch %t -verify -Wno-vla %s -ast-print | FileCheck -check-prefixes=CHECK,OMP60 %s24// RUN: %clang_cc1 -DOMP60 -fopenmp-simd -fopenmp-version=60 -std=c++11 -verify -Wno-vla %s -ast-dump | FileCheck -check-prefixes=OMP60_DUMP %s25// expected-no-diagnostics26 27#ifndef HEADER28#define HEADER29 30#ifdef OMP6031int global;32int global2;33 34void bar(int j) { };35#endif36 37void foo() {}38 39struct S1 {40 S1(): a(0) {}41 S1(int v) : a(v) {}42 int a;43 typedef int type;44 S1& operator +(const S1&);45 S1& operator *(const S1&);46 S1& operator &&(const S1&);47 S1& operator ^(const S1&);48};49 50template <typename T>51class S7 : public T {52protected:53 T a;54 T b[100];55 S7() : a(0) {}56 57public:58 S7(typename T::type v) : a(v) {59#pragma omp parallel private(a) private(this->a) private(T::a)60 for (int k = 0; k < a.a; ++k)61 ++this->a.a;62#pragma omp parallel firstprivate(a) firstprivate(this->a) firstprivate(T::a)63 for (int k = 0; k < a.a; ++k)64 ++this->a.a;65#pragma omp parallel shared(a) shared(this->a) shared(T::a)66 for (int k = 0; k < a.a; ++k)67 ++this->a.a;68#pragma omp parallel reduction(+ : a) reduction(*: b[:])69 for (int k = 0; k < a.a; ++k)70 ++this->a.a;71 }72 S7 &operator=(S7 &s) {73#pragma omp parallel private(a) private(this->a)74 for (int k = 0; k < s.a.a; ++k)75 ++s.a.a;76#pragma omp parallel firstprivate(a) firstprivate(this->a)77 for (int k = 0; k < s.a.a; ++k)78 ++s.a.a;79#pragma omp parallel shared(a) shared(this->a)80 for (int k = 0; k < s.a.a; ++k)81 ++s.a.a;82#pragma omp parallel reduction(&& : this->a) reduction(^: b[s.a.a])83 for (int k = 0; k < s.a.a; ++k)84 ++s.a.a;85 return *this;86 }87};88 89// CHECK: #pragma omp parallel private(this->a) private(this->a) private(T::a)90// CHECK: #pragma omp parallel firstprivate(this->a) firstprivate(this->a) firstprivate(T::a)91// CHECK: #pragma omp parallel shared(this->a) shared(this->a) shared(T::a)92// CHECK: #pragma omp parallel reduction(+: this->a) reduction(*: this->b[:])93// CHECK: #pragma omp parallel private(this->a) private(this->a)94// CHECK: #pragma omp parallel firstprivate(this->a) firstprivate(this->a)95// CHECK: #pragma omp parallel shared(this->a) shared(this->a)96// CHECK: #pragma omp parallel reduction(&&: this->a) reduction(^: this->b[s.a.a])97// CHECK: #pragma omp parallel private(this->a) private(this->a) private(this->S1::a)98// CHECK: #pragma omp parallel firstprivate(this->a) firstprivate(this->a) firstprivate(this->S1::a)99// CHECK: #pragma omp parallel shared(this->a) shared(this->a) shared(this->S1::a)100// CHECK: #pragma omp parallel reduction(+: this->a) reduction(*: this->b[:])101 102class S8 : public S7<S1> {103 S8() {}104 105public:106 S8(int v) : S7<S1>(v){107#pragma omp parallel private(a) private(this->a) private(S7 < S1 > ::a)108 for (int k = 0; k < a.a; ++k)109 ++this->a.a;110#pragma omp parallel firstprivate(a) firstprivate(this->a) firstprivate(S7 < S1 > ::a)111 for (int k = 0; k < a.a; ++k)112 ++this->a.a;113#pragma omp parallel shared(a) shared(this->a) shared(S7 < S1 > ::a)114 for (int k = 0; k < a.a; ++k)115 ++this->a.a;116#pragma omp parallel reduction(default, ^ : S7 < S1 > ::a) reduction(+ : S7 < S1 > ::b[ : S7 < S1 > ::a.a])117 for (int k = 0; k < a.a; ++k)118 ++this->a.a;119 }120 S8 &operator=(S8 &s) {121#pragma omp parallel private(a) private(this->a)122 for (int k = 0; k < s.a.a; ++k)123 ++s.a.a;124#pragma omp parallel firstprivate(a) firstprivate(this->a)125 for (int k = 0; k < s.a.a; ++k)126 ++s.a.a;127#pragma omp parallel shared(a) shared(this->a)128 for (int k = 0; k < s.a.a; ++k)129 ++s.a.a;130#pragma omp parallel reduction(* : this->a) reduction(&&:this->b[a.a:])131 for (int k = 0; k < s.a.a; ++k)132 ++s.a.a;133 return *this;134 }135};136 137// CHECK: #pragma omp parallel private(this->a) private(this->a) private(this->S7<S1>::a)138// CHECK: #pragma omp parallel firstprivate(this->a) firstprivate(this->a) firstprivate(this->S7<S1>::a)139// CHECK: #pragma omp parallel shared(this->a) shared(this->a) shared(this->S7<S1>::a)140// CHECK: #pragma omp parallel reduction(default, ^: this->S7<S1>::a) reduction(+: this->S7<S1>::b[:this->S7<S1>::a.a])141// CHECK: #pragma omp parallel private(this->a) private(this->a)142// CHECK: #pragma omp parallel firstprivate(this->a) firstprivate(this->a)143// CHECK: #pragma omp parallel shared(this->a) shared(this->a)144// CHECK: #pragma omp parallel reduction(*: this->a) reduction(&&: this->b[this->a.a:])145 146template <class T>147struct S {148 operator T() {return T();}149 static T TS;150 #pragma omp threadprivate(TS)151};152 153// CHECK: template <class T> struct S {154// CHECK: static T TS;155// CHECK-NEXT: #pragma omp threadprivate(S::TS)156// CHECK: };157// CHECK: template<> struct S<int> {158// CHECK: static int TS;159// CHECK-NEXT: #pragma omp threadprivate(S<int>::TS)160// CHECK-NEXT: }161// CHECK: template<> struct S<long> {162// CHECK: static long TS;163// CHECK-NEXT: #pragma omp threadprivate(S<long>::TS)164// CHECK-NEXT: }165 166int thrp;167#pragma omp threadprivate(thrp)168 169template <typename T, int C>170T tmain(T argc, T *argv) {171 T b = argc, c, d, e, f, g;172 static T a;173 S<T> s;174 T arr[C][10], arr1[C];175#pragma omp parallel176 a=2;177#pragma omp parallel default(none), private(argc,b) firstprivate(argv) shared (d) if (parallel:argc > 0) num_threads(C) copyin(S<T>::TS, thrp) proc_bind(master) reduction(+:c, arr1[argc]) reduction(max:e, arr[:C][0:10])178 foo();179#ifdef OMP51180#pragma omp parallel default(none), private(argc,b) firstprivate(argv) shared (d) if (parallel:argc > 0) num_threads(C) copyin(S<T>::TS, thrp) proc_bind(primary) reduction(+:c, arr1[argc]) reduction(max:e, arr[:C][0:10])181 foo();182#endif183#ifdef OMP60184#pragma omp parallel default(none), private(argc,b) firstprivate(argv) shared (d) if (parallel:argc > 0) num_threads(strict: C) copyin(S<T>::TS, thrp) proc_bind(primary) reduction(+:c, arr1[argc]) reduction(max:e, arr[:C][0:10]) message("msg") severity(fatal)185 foo();186#endif187#pragma omp parallel if (C) num_threads(s) proc_bind(close) reduction(^:e, f, arr[0:C][:argc]) reduction(default, && : g) reduction(task,+:argc)188 foo();189#ifdef OMP60190#pragma omp parallel if (C) num_threads(strict: s) proc_bind(close) reduction(^:e, f, arr[0:C][:argc]) reduction(default, && : g) reduction(task,+:argc) message("msg") severity(warning)191 foo();192#endif193 return 0;194}195 196 197#ifdef OMP60198// OMP60_DUMP: FunctionDecl {{.*}}mainVC {{.*}}199// OMP60_DUMP: OMPParallelDirective {{.*}}200// OMP60_DUMP-NEXT: OMPSharedClause{{.*}}201// OMP60_DUMP-NEXT: {{.*}}DeclRefExpr{{.*}} 'global' 'int'{{.*}}202// OMP60_DUMP-NEXT: OMPDefaultClause {{.*}}203// OMP60_DUMP-NEXT: OMPFirstprivateClause{{.*}}204// OMP60_DUMP-NEXT: {{.*}}DeclRefExpr{{.*}} 'h' 'int[20]'{{.*}}205// OMP60_DUMP: OMPParallelDirective {{.*}}206// OMP60_DUMP-NEXT: OMPPrivateClause{{.*}}207// OMP60_DUMP-NEXT: {{.*}}DeclRefExpr{{.*}} 'global2' 'int'{{.*}}208// OMP60_DUMP-NEXT: OMPDefaultClause {{.*}}209// OMP60_DUMP-NEXT: OMPPrivateClause {{.*}}210// OMP60_DUMP-NEXT: {{.*}}DeclRefExpr{{.*}} 'j' 'int'{{.*}}211int mainVC(int argc, int *argv) {212 int h[20];213 int j;214#pragma omp parallel shared(global) default(firstprivate: aggregate)215 bar(h[1]), h[1] = global;216#pragma omp parallel private(global2) default(private: scalar)217 bar(global2), j = global2;218 return 0;219}220#endif221 222// CHECK: template <typename T, int C> T tmain(T argc, T *argv) {223// CHECK-NEXT: T b = argc, c, d, e, f, g;224// CHECK-NEXT: static T a;225// CHECK-NEXT: S<T> s;226// CHECK-NEXT: T arr[C][10], arr1[C];227// CHECK-NEXT: #pragma omp parallel{{$}}228// CHECK-NEXT: a = 2;229// CHECK-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(C) copyin(S<T>::TS,thrp) proc_bind(master) reduction(+: c,arr1[argc]) reduction(max: e,arr[:C][0:10])230// CHECK-NEXT: foo()231// OMP51-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(C) copyin(S<T>::TS,thrp) proc_bind(primary) reduction(+: c,arr1[argc]) reduction(max: e,arr[:C][0:10])232// OMP51-NEXT: foo()233// OMP60-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(strict: C) copyin(S<T>::TS,thrp) proc_bind(primary) reduction(+: c,arr1[argc]) reduction(max: e,arr[:C][0:10]) message("msg") severity(fatal)234// OMP60-NEXT: foo()235// CHECK-NEXT: #pragma omp parallel if(C) num_threads(s) proc_bind(close) reduction(^: e,f,arr[0:C][:argc]) reduction(default, &&: g) reduction(task, +: argc)236// CHECK-NEXT: foo()237// OMP60-NEXT: #pragma omp parallel if(C) num_threads(strict: s) proc_bind(close) reduction(^: e,f,arr[0:C][:argc]) reduction(default, &&: g) reduction(task, +: argc) message("msg") severity(warning)238// OMP60-NEXT: foo()239// CHECK: template<> int tmain<int, 5>(int argc, int *argv) {240// CHECK-NEXT: int b = argc, c, d, e, f, g;241// CHECK-NEXT: static int a;242// CHECK-NEXT: S<int> s;243// CHECK-NEXT: int arr[5][10], arr1[5];244// CHECK-NEXT: #pragma omp parallel245// CHECK-NEXT: a = 2;246// CHECK-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(5) copyin(S<int>::TS,thrp) proc_bind(master) reduction(+: c,arr1[argc]) reduction(max: e,arr[:5][0:10])247// CHECK-NEXT: foo()248// OMP51-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(5) copyin(S<int>::TS,thrp) proc_bind(primary) reduction(+: c,arr1[argc]) reduction(max: e,arr[:5][0:10])249// OMP51-NEXT: foo()250// OMP60-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(strict: 5) copyin(S<int>::TS,thrp) proc_bind(primary) reduction(+: c,arr1[argc]) reduction(max: e,arr[:5][0:10]) message("msg") severity(fatal)251// OMP60-NEXT: foo()252// CHECK-NEXT: #pragma omp parallel if(5) num_threads(s) proc_bind(close) reduction(^: e,f,arr[0:5][:argc]) reduction(default, &&: g) reduction(task, +: argc)253// CHECK-NEXT: foo()254// OMP60-NEXT: #pragma omp parallel if(5) num_threads(strict: s) proc_bind(close) reduction(^: e,f,arr[0:5][:argc]) reduction(default, &&: g) reduction(task, +: argc) message("msg") severity(warning)255// OMP60-NEXT: foo()256// CHECK: template<> long tmain<long, 1>(long argc, long *argv) {257// CHECK-NEXT: long b = argc, c, d, e, f, g;258// CHECK-NEXT: static long a;259// CHECK-NEXT: S<long> s;260// CHECK-NEXT: long arr[1][10], arr1[1];261// CHECK-NEXT: #pragma omp parallel262// CHECK-NEXT: a = 2;263// CHECK-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(1) copyin(S<long>::TS,thrp) proc_bind(master) reduction(+: c,arr1[argc]) reduction(max: e,arr[:1][0:10])264// CHECK-NEXT: foo()265// OMP51-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(1) copyin(S<long>::TS,thrp) proc_bind(primary) reduction(+: c,arr1[argc]) reduction(max: e,arr[:1][0:10])266// OMP51-NEXT: foo()267// OMP60-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(strict: 1) copyin(S<long>::TS,thrp) proc_bind(primary) reduction(+: c,arr1[argc]) reduction(max: e,arr[:1][0:10]) message("msg") severity(fatal)268// OMP60-NEXT: foo()269// CHECK-NEXT: #pragma omp parallel if(1) num_threads(s) proc_bind(close) reduction(^: e,f,arr[0:1][:argc]) reduction(default, &&: g) reduction(task, +: argc)270// CHECK-NEXT: foo()271// OMP60-NEXT: #pragma omp parallel if(1) num_threads(strict: s) proc_bind(close) reduction(^: e,f,arr[0:1][:argc]) reduction(default, &&: g) reduction(task, +: argc) message("msg") severity(warning)272// OMP60-NEXT: foo()273 274// OMP60: int mainVC(int argc, int *argv) {275// OMP60-NEXT: int h[20];276// OMP60-NEXT: int j;277// OMP60-NEXT: #pragma omp parallel shared(global) default(firstprivate:aggregate)278// OMP60-NEXT: bar(h[1]) , h[1] = global;279// OMP60-NEXT: #pragma omp parallel private(global2) default(private:scalar)280// OMP60-NEXT: bar(global2) , j = global2;281 282enum Enum { };283 284int main (int argc, char **argv) {285 long x;286 int b = argc, c, d, e, f, g;287 static int a;288 #pragma omp threadprivate(a)289 int arr[10][argc], arr1[2];290 Enum ee;291// CHECK: Enum ee;292#pragma omp parallel293// CHECK-NEXT: #pragma omp parallel294 a=2;295// CHECK-NEXT: a = 2;296#pragma omp parallel default(none), private(argc,b) firstprivate(argv) if (parallel: argc > 0) num_threads(ee) copyin(a) proc_bind(spread) reduction(| : c, d, arr1[argc]) reduction(* : e, arr[:10][0:argc]) allocate(e)297// CHECK-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) if(parallel: argc > 0) num_threads(ee) copyin(a) proc_bind(spread) reduction(|: c,d,arr1[argc]) reduction(*: e,arr[:10][0:argc]) allocate(e)298 foo();299// CHECK-NEXT: foo();300#ifdef OMP60301#pragma omp parallel default(none), private(argc,b) firstprivate(argv) if (parallel: argc > 0) num_threads(strict: ee) copyin(a) proc_bind(spread) reduction(| : c, d, arr1[argc]) reduction(* : e, arr[:10][0:argc]) allocate(e) message("msg") severity(fatal)302// OMP60-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) if(parallel: argc > 0) num_threads(strict: ee) copyin(a) proc_bind(spread) reduction(|: c,d,arr1[argc]) reduction(*: e,arr[:10][0:argc]) allocate(e) message("msg") severity(fatal)303 foo();304// OMP60-NEXT: foo();305#endif306#pragma omp parallel allocate(e) if (b) num_threads(c) proc_bind(close) reduction(^:e, f) reduction(&& : g, arr[0:argc][:10])307// CHECK-NEXT: #pragma omp parallel allocate(e) if(b) num_threads(c) proc_bind(close) reduction(^: e,f) reduction(&&: g,arr[0:argc][:10])308 foo();309// CHECK-NEXT: foo()310#ifdef OMP60311#pragma omp parallel allocate(e) if (b) num_threads(strict: c) proc_bind(close) reduction(^:e, f) reduction(&& : g, arr[0:argc][:10]) message("msg") severity(warning)312// OMP60-NEXT: #pragma omp parallel allocate(e) if(b) num_threads(strict: c) proc_bind(close) reduction(^: e,f) reduction(&&: g,arr[0:argc][:10]) message("msg") severity(warning)313 foo();314// OMP60-NEXT: foo()315#endif316 return tmain<int, 5>(b, &b) + tmain<long, 1>(x, &x);317}318 319template <class T>320struct Foo {321 int foo;322};323 324void foo(const Foo<int> &arg) {325// CHECK: #pragma omp parallel326#pragma omp parallel327 {328// CHECK: #pragma omp for schedule(static)329#pragma omp for schedule(static)330 for (int idx = 0; idx < 1234; ++idx) {331 //arg.foo = idx;332 idx = arg.foo;333 }334 }335}336 337template<typename T>338T S<T>::TS = 0;339 340#endif341