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 // expected-no-diagnostics 5 6 #ifndef HEADER 7 #define HEADER 8 9 void foo() {} 10 11 template <typename T, int C> 12 T tmain(T argc, T *argv) { 13 T i, j, a[20], always; 14 #pragma omp target 15 foo(); 16 #pragma omp target if (target:argc > 0) 17 foo(); 18 #pragma omp target if (C) 19 foo(); 20 #pragma omp target map(i) 21 foo(); 22 #pragma omp target map(a[0:10], i) 23 foo(); 24 #pragma omp target map(to: i) map(from: j) 25 foo(); 26 #pragma omp target map(always,alloc: i) 27 foo(); 28 #pragma omp target map(always from: i) 29 foo(); 30 #pragma omp target map(always) 31 {always++;} 32 #pragma omp target map(always,i) 33 {always++;i++;} 34 #pragma omp target nowait 35 foo(); 36 #pragma omp target depend(in : argc, argv[i:argc], a[:]) 37 foo(); 38 #pragma omp target defaultmap(tofrom: scalar) 39 foo(); 40 return 0; 41 } 42 43 // CHECK: template <typename T, int C> T tmain(T argc, T *argv) { 44 // CHECK-NEXT: T i, j, a[20] 45 // CHECK-NEXT: #pragma omp target 46 // CHECK-NEXT: foo(); 47 // CHECK-NEXT: #pragma omp target if(target: argc > 0) 48 // CHECK-NEXT: foo() 49 // CHECK-NEXT: #pragma omp target if(C) 50 // CHECK-NEXT: foo() 51 // CHECK-NEXT: #pragma omp target map(tofrom: i) 52 // CHECK-NEXT: foo() 53 // CHECK-NEXT: #pragma omp target map(tofrom: a[0:10],i) 54 // CHECK-NEXT: foo() 55 // CHECK-NEXT: #pragma omp target map(to: i) map(from: j) 56 // CHECK-NEXT: foo() 57 // CHECK-NEXT: #pragma omp target map(always,alloc: i) 58 // CHECK-NEXT: foo() 59 // CHECK-NEXT: #pragma omp target map(always,from: i) 60 // CHECK-NEXT: foo() 61 // CHECK-NEXT: #pragma omp target map(tofrom: always) 62 // CHECK-NEXT: { 63 // CHECK-NEXT: always++; 64 // CHECK-NEXT: } 65 // CHECK-NEXT: #pragma omp target map(tofrom: always,i) 66 // CHECK-NEXT: { 67 // CHECK-NEXT: always++; 68 // CHECK-NEXT: i++; 69 // CHECK-NEXT: } 70 // CHECK-NEXT: #pragma omp target nowait 71 // CHECK-NEXT: foo() 72 // CHECK-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) 73 // CHECK-NEXT: foo() 74 // CHECK-NEXT: #pragma omp target defaultmap(tofrom: scalar) 75 // CHECK-NEXT: foo() 76 // CHECK: template<> int tmain<int, 5>(int argc, int *argv) { 77 // CHECK-NEXT: int i, j, a[20] 78 // CHECK-NEXT: #pragma omp target 79 // CHECK-NEXT: foo(); 80 // CHECK-NEXT: #pragma omp target if(target: argc > 0) 81 // CHECK-NEXT: foo() 82 // CHECK-NEXT: #pragma omp target if(5) 83 // CHECK-NEXT: foo() 84 // CHECK-NEXT: #pragma omp target map(tofrom: i) 85 // CHECK-NEXT: foo() 86 // CHECK-NEXT: #pragma omp target map(tofrom: a[0:10],i) 87 // CHECK-NEXT: foo() 88 // CHECK-NEXT: #pragma omp target map(to: i) map(from: j) 89 // CHECK-NEXT: foo() 90 // CHECK-NEXT: #pragma omp target map(always,alloc: i) 91 // CHECK-NEXT: foo() 92 // CHECK-NEXT: #pragma omp target map(always,from: i) 93 // CHECK-NEXT: foo() 94 // CHECK-NEXT: #pragma omp target map(tofrom: always) 95 // CHECK-NEXT: { 96 // CHECK-NEXT: always++; 97 // CHECK-NEXT: } 98 // CHECK-NEXT: #pragma omp target map(tofrom: always,i) 99 // CHECK-NEXT: { 100 // CHECK-NEXT: always++; 101 // CHECK-NEXT: i++; 102 // CHECK-NEXT: } 103 // CHECK-NEXT: #pragma omp target nowait 104 // CHECK-NEXT: foo() 105 // CHECK-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) 106 // CHECK-NEXT: foo() 107 // CHECK-NEXT: #pragma omp target defaultmap(tofrom: scalar) 108 // CHECK-NEXT: foo() 109 // CHECK: template<> char tmain<char, 1>(char argc, char *argv) { 110 // CHECK-NEXT: char i, j, a[20] 111 // CHECK-NEXT: #pragma omp target 112 // CHECK-NEXT: foo(); 113 // CHECK-NEXT: #pragma omp target if(target: argc > 0) 114 // CHECK-NEXT: foo() 115 // CHECK-NEXT: #pragma omp target if(1) 116 // CHECK-NEXT: foo() 117 // CHECK-NEXT: #pragma omp target map(tofrom: i) 118 // CHECK-NEXT: foo() 119 // CHECK-NEXT: #pragma omp target map(tofrom: a[0:10],i) 120 // CHECK-NEXT: foo() 121 // CHECK-NEXT: #pragma omp target map(to: i) map(from: j) 122 // CHECK-NEXT: foo() 123 // CHECK-NEXT: #pragma omp target map(always,alloc: i) 124 // CHECK-NEXT: foo() 125 // CHECK-NEXT: #pragma omp target map(always,from: i) 126 // CHECK-NEXT: foo() 127 // CHECK-NEXT: #pragma omp target map(tofrom: always) 128 // CHECK-NEXT: { 129 // CHECK-NEXT: always++; 130 // CHECK-NEXT: } 131 // CHECK-NEXT: #pragma omp target map(tofrom: always,i) 132 // CHECK-NEXT: { 133 // CHECK-NEXT: always++; 134 // CHECK-NEXT: i++; 135 // CHECK-NEXT: } 136 // CHECK-NEXT: #pragma omp target nowait 137 // CHECK-NEXT: foo() 138 // CHECK-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) 139 // CHECK-NEXT: foo() 140 // CHECK-NEXT: #pragma omp target defaultmap(tofrom: scalar) 141 // CHECK-NEXT: foo() 142 143 // CHECK-LABEL: int main(int argc, char **argv) { 144 int main (int argc, char **argv) { 145 int i, j, a[20], always; 146 // CHECK-NEXT: int i, j, a[20] 147 #pragma omp target 148 // CHECK-NEXT: #pragma omp target 149 foo(); 150 // CHECK-NEXT: foo(); 151 #pragma omp target if (argc > 0) 152 // CHECK-NEXT: #pragma omp target if(argc > 0) 153 foo(); 154 // CHECK-NEXT: foo(); 155 156 #pragma omp target map(i) if(argc>0) 157 // CHECK-NEXT: #pragma omp target map(tofrom: i) if(argc > 0) 158 foo(); 159 // CHECK-NEXT: foo(); 160 161 #pragma omp target map(i) 162 // CHECK-NEXT: #pragma omp target map(tofrom: i) 163 foo(); 164 // CHECK-NEXT: foo(); 165 166 #pragma omp target map(a[0:10], i) 167 // CHECK-NEXT: #pragma omp target map(tofrom: a[0:10],i) 168 foo(); 169 // CHECK-NEXT: foo(); 170 171 #pragma omp target map(to: i) map(from: j) 172 // CHECK-NEXT: #pragma omp target map(to: i) map(from: j) 173 foo(); 174 // CHECK-NEXT: foo(); 175 176 #pragma omp target map(always,alloc: i) 177 // CHECK-NEXT: #pragma omp target map(always,alloc: i) 178 foo(); 179 // CHECK-NEXT: foo(); 180 181 #pragma omp target map(always from: i) 182 // CHECK-NEXT: #pragma omp target map(always,from: i) 183 foo(); 184 // CHECK-NEXT: foo(); 185 186 #pragma omp target map(always) 187 // CHECK-NEXT: #pragma omp target map(tofrom: always) 188 {always++;} 189 // CHECK-NEXT: { 190 // CHECK-NEXT: always++; 191 // CHECK-NEXT: } 192 193 #pragma omp target map(always,i) 194 // CHECK-NEXT: #pragma omp target map(tofrom: always,i) 195 {always++;i++;} 196 // CHECK-NEXT: { 197 // CHECK-NEXT: always++; 198 // CHECK-NEXT: i++; 199 // CHECK-NEXT: } 200 201 #pragma omp target nowait 202 // CHECK-NEXT: #pragma omp target nowait 203 foo(); 204 // CHECK-NEXT: foo(); 205 206 #pragma omp target depend(in : argc, argv[i:argc], a[:]) 207 // CHECK-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) 208 foo(); 209 // CHECK-NEXT: foo(); 210 211 #pragma omp target defaultmap(tofrom: scalar) 212 // CHECK-NEXT: #pragma omp target defaultmap(tofrom: scalar) 213 foo(); 214 // CHECK-NEXT: foo(); 215 216 return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]); 217 } 218 219 #endif 220