195 lines · cpp
1// RUN: %clang_cc1 -verify -fopenmp -ast-print %s -Wno-openmp-mapping | FileCheck %s2// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s3// RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s4 5// RUN: %clang_cc1 -verify -fopenmp-simd -ast-print %s -Wno-openmp-mapping | FileCheck %s6// RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -emit-pch -o %t %s7// RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s8// expected-no-diagnostics9 10#ifndef HEADER11#define HEADER12 13typedef void **omp_allocator_handle_t;14extern const omp_allocator_handle_t omp_null_allocator;15extern const omp_allocator_handle_t omp_default_mem_alloc;16extern const omp_allocator_handle_t omp_large_cap_mem_alloc;17extern const omp_allocator_handle_t omp_const_mem_alloc;18extern const omp_allocator_handle_t omp_high_bw_mem_alloc;19extern const omp_allocator_handle_t omp_low_lat_mem_alloc;20extern const omp_allocator_handle_t omp_cgroup_mem_alloc;21extern const omp_allocator_handle_t omp_pteam_mem_alloc;22extern const omp_allocator_handle_t omp_thread_mem_alloc;23 24void foo() {}25 26struct S {27 S(): a(0) {}28 S(int v) : a(v) {}29 int a;30 typedef int type;31};32 33template <typename T>34class S7 : public T {35protected:36 T a;37 S7() : a(0) {}38 39public:40 S7(typename T::type v) : a(v) {41#pragma omp target42#pragma omp teams distribute private(a) private(this->a) private(T::a)43 for (int k = 0; k < a.a; ++k)44 ++this->a.a;45 }46 S7 &operator=(S7 &s) {47#pragma omp target48#pragma omp teams distribute private(a) private(this->a)49 for (int k = 0; k < s.a.a; ++k)50 ++s.a.a;51 return *this;52 }53 54 void foo() {55 int b, argv, d, c, e, f;56#pragma omp target57#pragma omp teams distribute default(none), private(b) firstprivate(argv) shared(d) reduction(+:c) reduction(max:e) num_teams(f) thread_limit(d)58 for (int k = 0; k < a.a; ++k)59 ++a.a;60 }61};62// CHECK: #pragma omp target63// CHECK-NEXT: #pragma omp teams distribute private(this->a) private(this->a) private(T::a)64// CHECK: #pragma omp target65// CHECK-NEXT: #pragma omp teams distribute private(this->a) private(this->a)66// CHECK: #pragma omp target67// CHECK-NEXT: #pragma omp teams distribute default(none) private(b) firstprivate(argv) shared(d) reduction(+: c) reduction(max: e) num_teams(f) thread_limit(d)68// CHECK: #pragma omp target69// CHECK-NEXT: #pragma omp teams distribute private(this->a) private(this->a) private(this->S::a)70 71class S8 : public S7<S> {72 S8() {}73 74public:75 S8(int v) : S7<S>(v){76#pragma omp target77#pragma omp teams distribute private(a) private(this->a) private(S7<S>::a) 78 for (int k = 0; k < a.a; ++k)79 ++this->a.a;80 }81 S8 &operator=(S8 &s) {82#pragma omp target83#pragma omp teams distribute private(a) private(this->a)84 for (int k = 0; k < s.a.a; ++k)85 ++s.a.a;86 return *this;87 }88 89 void bar() {90 int b, argv, d, c, e, f;91#pragma omp target92#pragma omp teams distribute allocate(omp_thread_mem_alloc:argv) default(none), private(b) firstprivate(argv) shared(d) reduction(+:c) reduction(max:e) num_teams(f) thread_limit(d) allocate(omp_default_mem_alloc:c) shared(omp_default_mem_alloc, omp_thread_mem_alloc)93 for (int k = 0; k < a.a; ++k)94 ++a.a;95 }96};97// CHECK: #pragma omp target98// CHECK-NEXT: #pragma omp teams distribute private(this->a) private(this->a) private(this->S7<S>::a)99// CHECK: #pragma omp target100// CHECK-NEXT: #pragma omp teams distribute private(this->a) private(this->a)101// CHECK: #pragma omp target102// CHECK-NEXT: #pragma omp teams distribute allocate(omp_thread_mem_alloc: argv) default(none) private(b) firstprivate(argv) shared(d) reduction(+: c) reduction(max: e) num_teams(f) thread_limit(d) allocate(omp_default_mem_alloc: c) shared(omp_default_mem_alloc,omp_thread_mem_alloc)103 104template <class T, int N>105T tmain(T argc) {106 T b = argc, c, d, e, f, g;107 static T a;108// CHECK: static T a;109#pragma omp target110#pragma omp teams distribute111 for (int i=0; i < 2; ++i)112 a = 2;113// CHECK: #pragma omp target114// CHECK-NEXT: #pragma omp teams distribute{{$}}115// CHECK-NEXT: for (int i = 0; i < 2; ++i)116// CHECK-NEXT: a = 2;117#pragma omp target118#pragma omp teams distribute private(argc, b), firstprivate(c, d), collapse(2)119 for (int i = 0; i < 10; ++i)120 for (int j = 0; j < 10; ++j)121 foo();122// CHECK: #pragma omp target123// CHECK-NEXT: #pragma omp teams distribute private(argc,b) firstprivate(c,d) collapse(2)124// CHECK-NEXT: for (int i = 0; i < 10; ++i)125// CHECK-NEXT: for (int j = 0; j < 10; ++j)126// CHECK-NEXT: foo();127 for (int i = 0; i < 10; ++i)128 foo();129// CHECK: for (int i = 0; i < 10; ++i)130// CHECK-NEXT: foo();131#pragma omp target132#pragma omp teams distribute133 for (int i = 0; i < 10; ++i)134 foo();135// CHECK: #pragma omp target136// CHECK-NEXT: #pragma omp teams distribute137// CHECK-NEXT: for (int i = 0; i < 10; ++i)138// CHECK-NEXT: foo(); 139#pragma omp target140#pragma omp teams distribute default(none), private(b) firstprivate(argc) shared(d) reduction(+:c) reduction(max:e) num_teams(f) thread_limit(d)141 for (int k = 0; k < 10; ++k)142 e += d + argc;143// CHECK: #pragma omp target144// CHECK-NEXT: #pragma omp teams distribute default(none) private(b) firstprivate(argc) shared(d) reduction(+: c) reduction(max: e) num_teams(f) thread_limit(d)145// CHECK-NEXT: for (int k = 0; k < 10; ++k)146// CHECK-NEXT: e += d + argc;147 return T();148}149 150int main (int argc, char **argv) {151 int b = argc, c, d, e, f, g;152 static int a;153// CHECK: static int a;154#pragma omp target155#pragma omp teams distribute156 for (int i=0; i < 2; ++i)157 a = 2;158// CHECK: #pragma omp target159// CHECK-NEXT: #pragma omp teams distribute160// CHECK-NEXT: for (int i = 0; i < 2; ++i)161// CHECK-NEXT: a = 2;162#pragma omp target163#pragma omp teams distribute private(argc,b),firstprivate(argv, c), collapse(2)164 for (int i = 0; i < 10; ++i)165 for (int j = 0; j < 10; ++j)166 foo();167// CHECK: #pragma omp target168// CHECK-NEXT: #pragma omp teams distribute private(argc,b) firstprivate(argv,c) collapse(2)169// CHECK-NEXT: for (int i = 0; i < 10; ++i)170// CHECK-NEXT: for (int j = 0; j < 10; ++j)171// CHECK-NEXT: foo();172 for (int i = 0; i < 10; ++i)173 foo();174// CHECK: for (int i = 0; i < 10; ++i)175// CHECK-NEXT: foo();176#pragma omp target177#pragma omp teams distribute178 for (int i = 0; i < 10; ++i)foo();179// CHECK: #pragma omp target180// CHECK-NEXT: #pragma omp teams distribute181// CHECK-NEXT: for (int i = 0; i < 10; ++i)182// CHECK-NEXT: foo();183#pragma omp target184#pragma omp teams distribute default(none), private(b) firstprivate(argc) shared(d) reduction(+:c) reduction(max:e) num_teams(f) thread_limit(d)185 for (int k = 0; k < 10; ++k)186 e += d + argc;187// CHECK: #pragma omp target188// CHECK-NEXT: #pragma omp teams distribute default(none) private(b) firstprivate(argc) shared(d) reduction(+: c) reduction(max: e) num_teams(f) thread_limit(d)189// CHECK-NEXT: for (int k = 0; k < 10; ++k)190// CHECK-NEXT: e += d + argc;191 return (0);192}193 194#endif195