132 lines · cpp
1// RUN: %clang_cc1 -verify -fopenmp -ast-print %s | 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 | FileCheck %s4 5// RUN: %clang_cc1 -verify -fopenmp-simd -ast-print %s | 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 | FileCheck %s8// expected-no-diagnostics9 10#ifndef HEADER11#define HEADER12 13struct omp_alloctrait_t {};14 15typedef void **omp_allocator_handle_t;16extern const omp_allocator_handle_t omp_null_allocator;17extern const omp_allocator_handle_t omp_default_mem_alloc;18extern const omp_allocator_handle_t omp_large_cap_mem_alloc;19extern const omp_allocator_handle_t omp_const_mem_alloc;20extern const omp_allocator_handle_t omp_high_bw_mem_alloc;21extern const omp_allocator_handle_t omp_low_lat_mem_alloc;22extern const omp_allocator_handle_t omp_cgroup_mem_alloc;23extern const omp_allocator_handle_t omp_pteam_mem_alloc;24extern const omp_allocator_handle_t omp_thread_mem_alloc;25 26void foo() {}27 28template <class T>29struct 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 44template <typename T, int C>45T 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 teams52 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 teams81// 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 teams93// 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 101enum Enum { };102 103int 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 teams111// CHECK-NEXT: #pragma omp target teams112 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 129extern template int S<int>::TS;130extern template long S<long>::TS;131#endif132