1 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -ast-print %s | FileCheck %s 2 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s 3 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s 4 5 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -ast-print %s | FileCheck %s 6 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s 7 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s 8 // expected-no-diagnostics 9 10 #ifndef HEADER 11 #define HEADER 12 13 void foo() {} 14 15 template <typename T, int C> 16 T tmain(T argc, T *argv) { 17 T i, j, b, c, d, e, x[20]; 18 19 #pragma omp target data map(to: c) 20 i = argc; 21 22 #pragma omp target data map(to: c) if (target data: j > 0) 23 foo(); 24 25 #pragma omp target data map(to: c) if (b) 26 foo(); 27 28 #pragma omp target data map(c) 29 foo(); 30 31 #pragma omp target data map(c) if(b>e) 32 foo(); 33 34 #pragma omp target data map(x[0:10], c) 35 foo(); 36 37 #pragma omp target data map(to: c) map(from: d) 38 foo(); 39 40 #pragma omp target data map(always,alloc: e) 41 foo(); 42 43 // nesting a target region 44 #pragma omp target data map(e) 45 { 46 #pragma omp target map(always, alloc: e) 47 foo(); 48 } 49 50 return 0; 51 } 52 53 // CHECK: template <typename T, int C> T tmain(T argc, T *argv) { 54 // CHECK-NEXT: T i, j, b, c, d, e, x[20]; 55 // CHECK-NEXT: #pragma omp target data map(to: c){{$}} 56 // CHECK-NEXT: i = argc; 57 // CHECK-NEXT: #pragma omp target data map(to: c) if(target data: j > 0) 58 // CHECK-NEXT: foo(); 59 // CHECK-NEXT: #pragma omp target data map(to: c) if(b) 60 // CHECK-NEXT: foo(); 61 // CHECK-NEXT: #pragma omp target data map(tofrom: c) 62 // CHECK-NEXT: foo(); 63 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > e) 64 // CHECK-NEXT: foo(); 65 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c) 66 // CHECK-NEXT: foo(); 67 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d) 68 // CHECK-NEXT: foo(); 69 // CHECK-NEXT: #pragma omp target data map(always,alloc: e) 70 // CHECK-NEXT: foo(); 71 // CHECK-NEXT: #pragma omp target data map(tofrom: e) 72 // CHECK-NEXT: { 73 // CHECK-NEXT: #pragma omp target map(always,alloc: e) 74 // CHECK-NEXT: foo(); 75 // CHECK: template<> int tmain<int, 5>(int argc, int *argv) { 76 // CHECK-NEXT: int i, j, b, c, d, e, x[20]; 77 // CHECK-NEXT: #pragma omp target data map(to: c) 78 // CHECK-NEXT: i = argc; 79 // CHECK-NEXT: #pragma omp target data map(to: c) if(target data: j > 0) 80 // CHECK-NEXT: foo(); 81 // CHECK-NEXT: #pragma omp target data map(to: c) if(b) 82 // CHECK-NEXT: foo(); 83 // CHECK-NEXT: #pragma omp target data map(tofrom: c) 84 // CHECK-NEXT: foo(); 85 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > e) 86 // CHECK-NEXT: foo(); 87 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c) 88 // CHECK-NEXT: foo(); 89 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d) 90 // CHECK-NEXT: foo(); 91 // CHECK-NEXT: #pragma omp target data map(always,alloc: e) 92 // CHECK-NEXT: foo(); 93 // CHECK-NEXT: #pragma omp target data map(tofrom: e) 94 // CHECK-NEXT: { 95 // CHECK-NEXT: #pragma omp target map(always,alloc: e) 96 // CHECK-NEXT: foo(); 97 // CHECK: template<> char tmain<char, 1>(char argc, char *argv) { 98 // CHECK-NEXT: char i, j, b, c, d, e, x[20]; 99 // CHECK-NEXT: #pragma omp target data map(to: c) 100 // CHECK-NEXT: i = argc; 101 // CHECK-NEXT: #pragma omp target data map(to: c) if(target data: j > 0) 102 // CHECK-NEXT: foo(); 103 // CHECK-NEXT: #pragma omp target data map(to: c) if(b) 104 // CHECK-NEXT: foo(); 105 // CHECK-NEXT: #pragma omp target data map(tofrom: c) 106 // CHECK-NEXT: foo(); 107 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > e) 108 // CHECK-NEXT: foo(); 109 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c) 110 // CHECK-NEXT: foo(); 111 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d) 112 // CHECK-NEXT: foo(); 113 // CHECK-NEXT: #pragma omp target data map(always,alloc: e) 114 // CHECK-NEXT: foo(); 115 // CHECK-NEXT: #pragma omp target data map(tofrom: e) 116 // CHECK-NEXT: { 117 // CHECK-NEXT: #pragma omp target map(always,alloc: e) 118 // CHECK-NEXT: foo(); 119 120 int main (int argc, char **argv) { 121 int b = argc, c, d, e, f, g, x[20]; 122 static int a; 123 // CHECK: static int a; 124 125 #pragma omp target data map(to: c) 126 // CHECK: #pragma omp target data map(to: c) 127 a=2; 128 // CHECK-NEXT: a = 2; 129 #pragma omp target data map(to: c) if (target data: b) 130 // CHECK: #pragma omp target data map(to: c) if(target data: b) 131 foo(); 132 // CHECK-NEXT: foo(); 133 134 #pragma omp target data map(to: c) if (b > g) 135 // CHECK: #pragma omp target data map(to: c) if(b > g) 136 foo(); 137 // CHECK-NEXT: foo(); 138 139 #pragma omp target data map(c) 140 // CHECK-NEXT: #pragma omp target data map(tofrom: c) 141 foo(); 142 // CHECK-NEXT: foo(); 143 144 #pragma omp target data map(c) if(b>g) 145 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > g) 146 foo(); 147 // CHECK-NEXT: foo(); 148 149 #pragma omp target data map(x[0:10], c) 150 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c) 151 foo(); 152 // CHECK-NEXT: foo(); 153 154 #pragma omp target data map(to: c) map(from: d) 155 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d) 156 foo(); 157 // CHECK-NEXT: foo(); 158 159 #pragma omp target data map(always,alloc: e) 160 // CHECK-NEXT: #pragma omp target data map(always,alloc: e) 161 foo(); 162 // CHECK-NEXT: foo(); 163 164 // nesting a target region 165 #pragma omp target data map(e) 166 // CHECK-NEXT: #pragma omp target data map(tofrom: e) 167 { 168 // CHECK-NEXT: { 169 #pragma omp target map(always, alloc: e) 170 // CHECK-NEXT: #pragma omp target map(always,alloc: e) 171 foo(); 172 // CHECK-NEXT: foo(); 173 } 174 return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]); 175 } 176 177 #endif 178