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 // 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 #pragma omp target data map(close,alloc: e) 44 foo(); 45 46 // nesting a target region 47 #pragma omp target data map(e) 48 { 49 #pragma omp target map(always, alloc: e) 50 foo(); 51 #pragma omp target map(close, alloc: e) 52 foo(); 53 } 54 55 return 0; 56 } 57 58 // CHECK: template <typename T, int C> T tmain(T argc, T *argv) { 59 // CHECK-NEXT: T i, j, b, c, d, e, x[20]; 60 // CHECK-NEXT: #pragma omp target data map(to: c){{$}} 61 // CHECK-NEXT: i = argc; 62 // CHECK-NEXT: #pragma omp target data map(to: c) if(target data: j > 0) 63 // CHECK-NEXT: foo(); 64 // CHECK-NEXT: #pragma omp target data map(to: c) if(b) 65 // CHECK-NEXT: foo(); 66 // CHECK-NEXT: #pragma omp target data map(tofrom: c) 67 // CHECK-NEXT: foo(); 68 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > e) 69 // CHECK-NEXT: foo(); 70 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c) 71 // CHECK-NEXT: foo(); 72 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d) 73 // CHECK-NEXT: foo(); 74 // CHECK-NEXT: #pragma omp target data map(always,alloc: e) 75 // CHECK-NEXT: foo(); 76 // CHECK-NEXT: #pragma omp target data map(close,alloc: e) 77 // CHECK-NEXT: foo(); 78 // CHECK-NEXT: #pragma omp target data map(tofrom: e) 79 // CHECK-NEXT: { 80 // CHECK-NEXT: #pragma omp target map(always,alloc: e) 81 // CHECK-NEXT: foo(); 82 // CHECK-NEXT: #pragma omp target map(close,alloc: e) 83 // CHECK-NEXT: foo(); 84 // CHECK: template<> int tmain<int, 5>(int argc, int *argv) { 85 // CHECK-NEXT: int i, j, b, c, d, e, x[20]; 86 // CHECK-NEXT: #pragma omp target data map(to: c) 87 // CHECK-NEXT: i = argc; 88 // CHECK-NEXT: #pragma omp target data map(to: c) if(target data: j > 0) 89 // CHECK-NEXT: foo(); 90 // CHECK-NEXT: #pragma omp target data map(to: c) if(b) 91 // CHECK-NEXT: foo(); 92 // CHECK-NEXT: #pragma omp target data map(tofrom: c) 93 // CHECK-NEXT: foo(); 94 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > e) 95 // CHECK-NEXT: foo(); 96 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c) 97 // CHECK-NEXT: foo(); 98 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d) 99 // CHECK-NEXT: foo(); 100 // CHECK-NEXT: #pragma omp target data map(always,alloc: e) 101 // CHECK-NEXT: foo(); 102 // CHECK-NEXT: #pragma omp target data map(close,alloc: e) 103 // CHECK-NEXT: foo(); 104 // CHECK-NEXT: #pragma omp target data map(tofrom: e) 105 // CHECK-NEXT: { 106 // CHECK-NEXT: #pragma omp target map(always,alloc: e) 107 // CHECK-NEXT: foo(); 108 // CHECK-NEXT: #pragma omp target map(close,alloc: e) 109 // CHECK-NEXT: foo(); 110 // CHECK: template<> char tmain<char, 1>(char argc, char *argv) { 111 // CHECK-NEXT: char i, j, b, c, d, e, x[20]; 112 // CHECK-NEXT: #pragma omp target data map(to: c) 113 // CHECK-NEXT: i = argc; 114 // CHECK-NEXT: #pragma omp target data map(to: c) if(target data: j > 0) 115 // CHECK-NEXT: foo(); 116 // CHECK-NEXT: #pragma omp target data map(to: c) if(b) 117 // CHECK-NEXT: foo(); 118 // CHECK-NEXT: #pragma omp target data map(tofrom: c) 119 // CHECK-NEXT: foo(); 120 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > e) 121 // CHECK-NEXT: foo(); 122 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c) 123 // CHECK-NEXT: foo(); 124 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d) 125 // CHECK-NEXT: foo(); 126 // CHECK-NEXT: #pragma omp target data map(always,alloc: e) 127 // CHECK-NEXT: foo(); 128 // CHECK-NEXT: #pragma omp target data map(close,alloc: e) 129 // CHECK-NEXT: foo(); 130 // CHECK-NEXT: #pragma omp target data map(tofrom: e) 131 // CHECK-NEXT: { 132 // CHECK-NEXT: #pragma omp target map(always,alloc: e) 133 // CHECK-NEXT: foo(); 134 // CHECK-NEXT: #pragma omp target map(close,alloc: e) 135 // CHECK-NEXT: foo(); 136 137 int main (int argc, char **argv) { 138 int b = argc, c, d, e, f, g, x[20]; 139 static int a; 140 // CHECK: static int a; 141 142 #pragma omp target data map(to: ([argc][3][a])argv) 143 // CHECK: #pragma omp target data map(to: ([argc][3][a])argv) 144 #pragma omp target data map(to: c) 145 // CHECK: #pragma omp target data map(to: c) 146 a=2; 147 // CHECK-NEXT: a = 2; 148 #pragma omp target data map(to: c) if (target data: b) 149 // CHECK: #pragma omp target data map(to: c) if(target data: b) 150 foo(); 151 // CHECK-NEXT: foo(); 152 153 #pragma omp target data map(to: c) if (b > g) 154 // CHECK: #pragma omp target data map(to: c) if(b > g) 155 foo(); 156 // CHECK-NEXT: foo(); 157 158 #pragma omp target data map(c) 159 // CHECK-NEXT: #pragma omp target data map(tofrom: c) 160 foo(); 161 // CHECK-NEXT: foo(); 162 163 #pragma omp target data map(c) if(b>g) 164 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > g) 165 foo(); 166 // CHECK-NEXT: foo(); 167 168 #pragma omp target data map(x[0:10], c) 169 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c) 170 foo(); 171 // CHECK-NEXT: foo(); 172 173 #pragma omp target data map(to: c) map(from: d) 174 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d) 175 foo(); 176 // CHECK-NEXT: foo(); 177 178 #pragma omp target data map(always,alloc: e) 179 // CHECK-NEXT: #pragma omp target data map(always,alloc: e) 180 foo(); 181 // CHECK-NEXT: foo(); 182 183 #pragma omp target data map(close,alloc: e) 184 // CHECK-NEXT: #pragma omp target data map(close,alloc: e) 185 foo(); 186 // CHECK-NEXT: foo(); 187 188 // nesting a target region 189 #pragma omp target data map(e) 190 // CHECK-NEXT: #pragma omp target data map(tofrom: e) 191 { 192 // CHECK-NEXT: { 193 #pragma omp target map(always, alloc: e) 194 // CHECK-NEXT: #pragma omp target map(always,alloc: e) 195 foo(); 196 // CHECK-NEXT: foo(); 197 #pragma omp target map(close, alloc: e) 198 // CHECK-NEXT: #pragma omp target map(close,alloc: e) 199 foo(); 200 } 201 202 return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]); 203 } 204 205 #endif 206