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 #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: c) 143 // CHECK: #pragma omp target data map(to: c) 144 a=2; 145 // CHECK-NEXT: a = 2; 146 #pragma omp target data map(to: c) if (target data: b) 147 // CHECK: #pragma omp target data map(to: c) if(target data: b) 148 foo(); 149 // CHECK-NEXT: foo(); 150 151 #pragma omp target data map(to: c) if (b > g) 152 // CHECK: #pragma omp target data map(to: c) if(b > g) 153 foo(); 154 // CHECK-NEXT: foo(); 155 156 #pragma omp target data map(c) 157 // CHECK-NEXT: #pragma omp target data map(tofrom: c) 158 foo(); 159 // CHECK-NEXT: foo(); 160 161 #pragma omp target data map(c) if(b>g) 162 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > g) 163 foo(); 164 // CHECK-NEXT: foo(); 165 166 #pragma omp target data map(x[0:10], c) 167 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c) 168 foo(); 169 // CHECK-NEXT: foo(); 170 171 #pragma omp target data map(to: c) map(from: d) 172 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d) 173 foo(); 174 // CHECK-NEXT: foo(); 175 176 #pragma omp target data map(always,alloc: e) 177 // CHECK-NEXT: #pragma omp target data map(always,alloc: e) 178 foo(); 179 // CHECK-NEXT: foo(); 180 181 #pragma omp target data map(close,alloc: e) 182 // CHECK-NEXT: #pragma omp target data map(close,alloc: e) 183 foo(); 184 // CHECK-NEXT: foo(); 185 186 // nesting a target region 187 #pragma omp target data map(e) 188 // CHECK-NEXT: #pragma omp target data map(tofrom: e) 189 { 190 // CHECK-NEXT: { 191 #pragma omp target map(always, alloc: e) 192 // CHECK-NEXT: #pragma omp target map(always,alloc: e) 193 foo(); 194 // CHECK-NEXT: foo(); 195 #pragma omp target map(close, alloc: e) 196 // CHECK-NEXT: #pragma omp target map(close,alloc: e) 197 foo(); 198 } 199 200 return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]); 201 } 202 203 #endif 204