1 // RUN: %clang_cc1 -verify -fopenmp -ast-print %s | FileCheck %s 2 // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s 3 // RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -verify %s -ast-print | FileCheck %s 4 5 // RUN: %clang_cc1 -verify -fopenmp-simd -ast-print %s | FileCheck %s 6 // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -emit-pch -o %t %s 7 // RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t -verify %s -ast-print | FileCheck %s 8 // expected-no-diagnostics 9 10 #ifndef HEADER 11 #define HEADER 12 13 struct omp_alloctrait_t {}; 14 15 typedef void **omp_allocator_handle_t; 16 extern const omp_allocator_handle_t omp_null_allocator; 17 extern const omp_allocator_handle_t omp_default_mem_alloc; 18 extern const omp_allocator_handle_t omp_large_cap_mem_alloc; 19 extern const omp_allocator_handle_t omp_const_mem_alloc; 20 extern const omp_allocator_handle_t omp_high_bw_mem_alloc; 21 extern const omp_allocator_handle_t omp_low_lat_mem_alloc; 22 extern const omp_allocator_handle_t omp_cgroup_mem_alloc; 23 extern const omp_allocator_handle_t omp_pteam_mem_alloc; 24 extern const omp_allocator_handle_t omp_thread_mem_alloc; 25 26 void foo() {} 27 28 template <class T> 29 struct S { 30 operator T() {return T();} 31 static T TS; 32 #pragma omp threadprivate(TS) 33 }; 34 35 // CHECK: template <class T> struct S { 36 // CHECK: static T TS; 37 // CHECK-NEXT: #pragma omp threadprivate(S::TS) 38 // CHECK: }; 39 // CHECK: template<> struct S<int> { 40 // CHECK: static int TS; 41 // CHECK-NEXT: #pragma omp threadprivate(S<int>::TS) 42 // CHECK-NEXT: } 43 44 template <typename T, int C> 45 T tmain(T argc, T *argv) { 46 T b = argc, c, d, e, f, g; 47 static T a; 48 S<T> s; 49 omp_alloctrait_t traits[10]; 50 omp_allocator_handle_t my_allocator; 51 #pragma omp target teams 52 a=2; 53 #pragma omp target teams default(none), private(argc,b) firstprivate(argv) shared (d) reduction(+:c) reduction(max:e) num_teams(C) thread_limit(d*C) allocate(argv) 54 foo(); 55 #pragma omp target teams allocate(my_allocator:f) reduction(^:e, f) reduction(&& : g) uses_allocators(my_allocator(traits)) 56 foo(); 57 #pragma omp target teams ompx_bare num_teams(C, C, C) thread_limit(d*C, d*C, d*C) 58 foo(); 59 return 0; 60 } 61 62 // CHECK: template <typename T, int C> T tmain(T argc, T *argv) { 63 // CHECK-NEXT: T b = argc, c, d, e, f, g; 64 // CHECK-NEXT: static T a; 65 // CHECK-NEXT: S<T> s; 66 // CHECK-NEXT: omp_alloctrait_t traits[10]; 67 // CHECK-NEXT: omp_allocator_handle_t my_allocator; 68 // CHECK-NEXT: #pragma omp target teams{{$}} 69 // CHECK-NEXT: a = 2; 70 // CHECK-NEXT: #pragma omp target teams default(none) private(argc,b) firstprivate(argv) shared(d) reduction(+: c) reduction(max: e) num_teams(C) thread_limit(d * C) allocate(argv) 71 // CHECK-NEXT: foo() 72 // CHECK-NEXT: #pragma omp target teams allocate(my_allocator: f) reduction(^: e,f) reduction(&&: g) uses_allocators(my_allocator(traits)) 73 // CHECK-NEXT: foo() 74 // CHECK: template<> int tmain<int, 5>(int argc, int *argv) { 75 // CHECK-NEXT: int b = argc, c, d, e, f, g; 76 // CHECK-NEXT: static int a; 77 // CHECK-NEXT: S<int> s; 78 // CHECK-NEXT: omp_alloctrait_t traits[10]; 79 // CHECK-NEXT: omp_allocator_handle_t my_allocator; 80 // CHECK-NEXT: #pragma omp target teams 81 // CHECK-NEXT: a = 2; 82 // CHECK-NEXT: #pragma omp target teams default(none) private(argc,b) firstprivate(argv) shared(d) reduction(+: c) reduction(max: e) num_teams(5) thread_limit(d * 5) allocate(argv) 83 // CHECK-NEXT: foo() 84 // CHECK-NEXT: #pragma omp target teams allocate(my_allocator: f) reduction(^: e,f) reduction(&&: g) uses_allocators(my_allocator(traits)) 85 // CHECK-NEXT: foo() 86 // CHECK: template<> long tmain<long, 1>(long argc, long *argv) { 87 // CHECK-NEXT: long b = argc, c, d, e, f, g; 88 // CHECK-NEXT: static long a; 89 // CHECK-NEXT: S<long> s; 90 // CHECK-NEXT: omp_alloctrait_t traits[10]; 91 // CHECK-NEXT: omp_allocator_handle_t my_allocator; 92 // CHECK-NEXT: #pragma omp target teams 93 // CHECK-NEXT: a = 2; 94 // CHECK-NEXT: #pragma omp target teams default(none) private(argc,b) firstprivate(argv) shared(d) reduction(+: c) reduction(max: e) num_teams(1) thread_limit(d * 1) allocate(argv) 95 // CHECK-NEXT: foo() 96 // CHECK-NEXT: #pragma omp target teams allocate(my_allocator: f) reduction(^: e,f) reduction(&&: g) uses_allocators(my_allocator(traits)) 97 // CHECK-NEXT: foo() 98 // CHECK-NEXT: #pragma omp target teams ompx_bare num_teams(1,1,1) thread_limit(d * 1,d * 1,d * 1) 99 // CHECK-NEXT: foo(); 100 101 enum Enum { }; 102 103 int main (int argc, char **argv) { 104 long x; 105 int b = argc, c, d, e, f, g; 106 static int a; 107 #pragma omp threadprivate(a) 108 Enum ee; 109 // CHECK: Enum ee; 110 #pragma omp target teams 111 // CHECK-NEXT: #pragma omp target teams 112 a=2; 113 // CHECK-NEXT: a = 2; 114 #pragma omp target teams ompx_bare num_teams(1) thread_limit(32) 115 // CHECK-NEXT: #pragma omp target teams ompx_bare num_teams(1) thread_limit(32) 116 a=3; 117 // CHECK-NEXT: a = 3; 118 #pragma omp target teams ompx_bare num_teams(1, 2, 3) thread_limit(2, 4, 6) 119 // CHECK-NEXT: #pragma omp target teams ompx_bare num_teams(1,2,3) thread_limit(2,4,6) 120 a=4; 121 // CHECK-NEXT: a = 4; 122 #pragma omp target teams default(none), private(argc,b) num_teams(f) firstprivate(argv) reduction(| : c, d) reduction(* : e) thread_limit(f+g) 123 // CHECK-NEXT: #pragma omp target teams default(none) private(argc,b) num_teams(f) firstprivate(argv) reduction(|: c,d) reduction(*: e) thread_limit(f + g) 124 foo(); 125 // CHECK-NEXT: foo(); 126 return tmain<int, 5>(b, &b) + tmain<long, 1>(x, &x); 127 } 128 129 extern template int S<int>::TS; 130 extern template long S<long>::TS; 131 #endif 132