1 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -ast-print %s | FileCheck %s 2 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s 3 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s 4 5 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=50 -ast-print %s | FileCheck %s 6 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s 7 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s 8 9 // RUN: %clang_cc1 -DOMP51 -verify -fopenmp -fopenmp-version=51 -ast-print %s | FileCheck -check-prefixes=CHECK,OMP51 %s 10 // RUN: %clang_cc1 -DOMP51 -fopenmp -fopenmp-version=51 -x c++ -std=c++11 -emit-pch -o %t %s 11 // RUN: %clang_cc1 -DOMP51 -fopenmp -fopenmp-version=51 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck -check-prefixes=CHECK,OMP51 %s 12 13 // RUN: %clang_cc1 -DOMP51 -verify -fopenmp-simd -fopenmp-version=51 -ast-print %s | FileCheck -check-prefixes=CHECK,OMP51 %s 14 // RUN: %clang_cc1 -DOMP51 -fopenmp-simd -fopenmp-version=51 -x c++ -std=c++11 -emit-pch -o %t %s 15 // RUN: %clang_cc1 -DOMP51 -fopenmp-simd -fopenmp-version=51 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck -check-prefixes=CHECK,OMP51 %s 16 // expected-no-diagnostics 17 18 #ifndef HEADER 19 #define HEADER 20 21 void foo() {} 22 23 template <typename T, int C> 24 T tmain(T argc, T *argv) { 25 T i, j, b, c, d, e, x[20]; 26 27 #pragma omp target data map(to: c) 28 i = argc; 29 30 #pragma omp target data map(to: c) if (target data: j > 0) 31 foo(); 32 33 #pragma omp target data map(to: c) if (b) 34 foo(); 35 36 #pragma omp target data map(c) 37 foo(); 38 39 #pragma omp target data map(c) if(b>e) 40 foo(); 41 42 #pragma omp target data map(x[0:10], c) 43 foo(); 44 45 #pragma omp target data map(to: c) map(from: d) 46 foo(); 47 48 #pragma omp target data map(always,alloc: e) 49 foo(); 50 51 #pragma omp target data map(close,alloc: e) 52 foo(); 53 54 #ifdef OMP51 55 #pragma omp target data map(present,alloc: e) 56 foo(); 57 #endif 58 59 // nesting a target region 60 #pragma omp target data map(e) 61 { 62 #pragma omp target map(always, alloc: e) 63 foo(); 64 #pragma omp target map(close, alloc: e) 65 foo(); 66 #ifdef OMP51 67 #pragma omp target map(present, alloc: e) 68 foo(); 69 #endif 70 } 71 72 return 0; 73 } 74 75 // CHECK: template <typename T, int C> T tmain(T argc, T *argv) { 76 // CHECK-NEXT: T 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(close,alloc: e) 94 // CHECK-NEXT: foo(); 95 // OMP51-NEXT: #pragma omp target data map(present,alloc: e) 96 // OMP51-NEXT: foo(); 97 // CHECK-NEXT: #pragma omp target data map(tofrom: e) 98 // CHECK-NEXT: { 99 // CHECK-NEXT: #pragma omp target map(always,alloc: e) 100 // CHECK-NEXT: foo(); 101 // CHECK-NEXT: #pragma omp target map(close,alloc: e) 102 // CHECK-NEXT: foo(); 103 // OMP51-NEXT: #pragma omp target map(present,alloc: e) 104 // OMP51-NEXT: foo(); 105 // CHECK: template<> int tmain<int, 5>(int argc, int *argv) { 106 // CHECK-NEXT: int i, j, b, c, d, e, x[20]; 107 // CHECK-NEXT: #pragma omp target data map(to: c) 108 // CHECK-NEXT: i = argc; 109 // CHECK-NEXT: #pragma omp target data map(to: c) if(target data: j > 0) 110 // CHECK-NEXT: foo(); 111 // CHECK-NEXT: #pragma omp target data map(to: c) if(b) 112 // CHECK-NEXT: foo(); 113 // CHECK-NEXT: #pragma omp target data map(tofrom: c) 114 // CHECK-NEXT: foo(); 115 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > e) 116 // CHECK-NEXT: foo(); 117 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c) 118 // CHECK-NEXT: foo(); 119 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d) 120 // CHECK-NEXT: foo(); 121 // CHECK-NEXT: #pragma omp target data map(always,alloc: e) 122 // CHECK-NEXT: foo(); 123 // CHECK-NEXT: #pragma omp target data map(close,alloc: e) 124 // CHECK-NEXT: foo(); 125 // OMP51-NEXT: #pragma omp target data map(present,alloc: e) 126 // OMP51-NEXT: foo(); 127 // CHECK-NEXT: #pragma omp target data map(tofrom: e) 128 // CHECK-NEXT: { 129 // CHECK-NEXT: #pragma omp target map(always,alloc: e) 130 // CHECK-NEXT: foo(); 131 // CHECK-NEXT: #pragma omp target map(close,alloc: e) 132 // CHECK-NEXT: foo(); 133 // OMP51-NEXT: #pragma omp target map(present,alloc: e) 134 // OMP51-NEXT: foo(); 135 // CHECK: template<> char tmain<char, 1>(char argc, char *argv) { 136 // CHECK-NEXT: char i, j, b, c, d, e, x[20]; 137 // CHECK-NEXT: #pragma omp target data map(to: c) 138 // CHECK-NEXT: i = argc; 139 // CHECK-NEXT: #pragma omp target data map(to: c) if(target data: j > 0) 140 // CHECK-NEXT: foo(); 141 // CHECK-NEXT: #pragma omp target data map(to: c) if(b) 142 // CHECK-NEXT: foo(); 143 // CHECK-NEXT: #pragma omp target data map(tofrom: c) 144 // CHECK-NEXT: foo(); 145 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > e) 146 // CHECK-NEXT: foo(); 147 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c) 148 // CHECK-NEXT: foo(); 149 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d) 150 // CHECK-NEXT: foo(); 151 // CHECK-NEXT: #pragma omp target data map(always,alloc: e) 152 // CHECK-NEXT: foo(); 153 // CHECK-NEXT: #pragma omp target data map(close,alloc: e) 154 // CHECK-NEXT: foo(); 155 // OMP51-NEXT: #pragma omp target data map(present,alloc: e) 156 // OMP51-NEXT: foo(); 157 // CHECK-NEXT: #pragma omp target data map(tofrom: e) 158 // CHECK-NEXT: { 159 // CHECK-NEXT: #pragma omp target map(always,alloc: e) 160 // CHECK-NEXT: foo(); 161 // CHECK-NEXT: #pragma omp target map(close,alloc: e) 162 // CHECK-NEXT: foo(); 163 // OMP51-NEXT: #pragma omp target map(present,alloc: e) 164 // OMP51-NEXT: foo(); 165 166 int main (int argc, char **argv) { 167 int b = argc, c, d, e, f, g, x[20]; 168 static int a; 169 // CHECK: static int a; 170 171 #pragma omp target data map(to: ([argc][3][a])argv) 172 // CHECK: #pragma omp target data map(to: ([argc][3][a])argv) 173 #pragma omp target data map(to: c) 174 // CHECK: #pragma omp target data map(to: c) 175 a=2; 176 // CHECK-NEXT: a = 2; 177 #pragma omp target data map(to: c) if (target data: b) 178 // CHECK: #pragma omp target data map(to: c) if(target data: b) 179 foo(); 180 // CHECK-NEXT: foo(); 181 182 #pragma omp target data map(to: c) if (b > g) 183 // CHECK: #pragma omp target data map(to: c) if(b > g) 184 foo(); 185 // CHECK-NEXT: foo(); 186 187 #pragma omp target data map(c) 188 // CHECK-NEXT: #pragma omp target data map(tofrom: c) 189 foo(); 190 // CHECK-NEXT: foo(); 191 192 #pragma omp target data map(c) if(b>g) 193 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > g) 194 foo(); 195 // CHECK-NEXT: foo(); 196 197 #pragma omp target data map(x[0:10], c) 198 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c) 199 foo(); 200 // CHECK-NEXT: foo(); 201 202 #pragma omp target data map(to: c) map(from: d) 203 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d) 204 foo(); 205 // CHECK-NEXT: foo(); 206 207 #pragma omp target data map(always,alloc: e) 208 // CHECK-NEXT: #pragma omp target data map(always,alloc: e) 209 foo(); 210 // CHECK-NEXT: foo(); 211 212 #pragma omp target data map(close,alloc: e) 213 // CHECK-NEXT: #pragma omp target data map(close,alloc: e) 214 foo(); 215 // CHECK-NEXT: foo(); 216 217 // OMP51-NEXT: #pragma omp target data map(present,alloc: e) 218 // OMP51-NEXT: foo(); 219 #ifdef OMP51 220 #pragma omp target data map(present,alloc: e) 221 foo(); 222 #endif 223 224 // nesting a target region 225 #pragma omp target data map(e) 226 // CHECK-NEXT: #pragma omp target data map(tofrom: e) 227 { 228 // CHECK-NEXT: { 229 #pragma omp target map(always, alloc: e) 230 // CHECK-NEXT: #pragma omp target map(always,alloc: e) 231 foo(); 232 // CHECK-NEXT: foo(); 233 #pragma omp target map(close, alloc: e) 234 // CHECK-NEXT: #pragma omp target map(close,alloc: e) 235 foo(); 236 // CHECK-NEXT: foo(); 237 #pragma omp target map(always, alloc: e) 238 // CHECK-NEXT: #pragma omp target map(always,alloc: e) 239 foo(); 240 } 241 242 return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]); 243 } 244 245 #endif 246