1193ee2dbSKelvin Li // RUN: %clang_cc1 -verify -fopenmp -std=c++11 -ast-print %s | FileCheck %s 2193ee2dbSKelvin Li // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s 3193ee2dbSKelvin Li // RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s 4a8a9153aSAlexey Bataev 5a8a9153aSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp-simd -std=c++11 -ast-print %s | FileCheck %s 6a8a9153aSAlexey Bataev // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -emit-pch -o %t %s 7a8a9153aSAlexey Bataev // RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s 8193ee2dbSKelvin Li // expected-no-diagnostics 9193ee2dbSKelvin Li 10193ee2dbSKelvin Li #ifndef HEADER 11193ee2dbSKelvin Li #define HEADER 12193ee2dbSKelvin Li 13193ee2dbSKelvin Li struct ST { 14193ee2dbSKelvin Li int *a; 15193ee2dbSKelvin Li }; 16193ee2dbSKelvin Li typedef int arr[10]; 17193ee2dbSKelvin Li typedef ST STarr[10]; 18193ee2dbSKelvin Li struct SA { 19193ee2dbSKelvin Li const int da[5] = { 0 }; 20193ee2dbSKelvin Li ST g[10]; 21193ee2dbSKelvin Li STarr &rg = g; 22193ee2dbSKelvin Li int i; 23193ee2dbSKelvin Li int &j = i; 24193ee2dbSKelvin Li int *k = &j; 25193ee2dbSKelvin Li int *&z = k; 26193ee2dbSKelvin Li int aa[10]; 27193ee2dbSKelvin Li arr &raa = aa; funcSA28193ee2dbSKelvin Li void func(int arg) { 29193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(k) 30193ee2dbSKelvin Li {} 31193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(z) 32193ee2dbSKelvin Li {} 33193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(aa) // OK 34193ee2dbSKelvin Li {} 35193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(raa) // OK 36193ee2dbSKelvin Li {} 37193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(g) // OK 38193ee2dbSKelvin Li {} 39193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(rg) // OK 40193ee2dbSKelvin Li {} 41193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(da) // OK 42193ee2dbSKelvin Li {} 43193ee2dbSKelvin Li return; 44193ee2dbSKelvin Li } 45193ee2dbSKelvin Li }; 46193ee2dbSKelvin Li // CHECK: struct SA 47193ee2dbSKelvin Li // CHECK-NEXT: const int da[5] = {0}; 48193ee2dbSKelvin Li // CHECK-NEXT: ST g[10]; 49193ee2dbSKelvin Li // CHECK-NEXT: STarr &rg = this->g; 50193ee2dbSKelvin Li // CHECK-NEXT: int i; 51193ee2dbSKelvin Li // CHECK-NEXT: int &j = this->i; 52193ee2dbSKelvin Li // CHECK-NEXT: int *k = &this->j; 53193ee2dbSKelvin Li // CHECK-NEXT: int *&z = this->k; 54193ee2dbSKelvin Li // CHECK-NEXT: int aa[10]; 55193ee2dbSKelvin Li // CHECK-NEXT: arr &raa = this->aa; 56193ee2dbSKelvin Li // CHECK-NEXT: func( 57*cbecfdfeSAlexey Bataev // CHECK-NEXT: #pragma omp target parallel is_device_ptr(this->k){{$}} 58193ee2dbSKelvin Li // CHECK-NEXT: { 59193ee2dbSKelvin Li // CHECK-NEXT: } 60193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(this->z) 61193ee2dbSKelvin Li // CHECK-NEXT: { 62193ee2dbSKelvin Li // CHECK-NEXT: } 63193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(this->aa) 64193ee2dbSKelvin Li // CHECK-NEXT: { 65193ee2dbSKelvin Li // CHECK-NEXT: } 66193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(this->raa) 67193ee2dbSKelvin Li // CHECK-NEXT: { 68193ee2dbSKelvin Li // CHECK-NEXT: } 69193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(this->g) 70193ee2dbSKelvin Li // CHECK-NEXT: { 71193ee2dbSKelvin Li // CHECK-NEXT: } 72193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(this->rg) 73193ee2dbSKelvin Li // CHECK-NEXT: { 74193ee2dbSKelvin Li // CHECK-NEXT: } 75193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(this->da) 76193ee2dbSKelvin Li 77193ee2dbSKelvin Li struct SB { 78193ee2dbSKelvin Li unsigned A; 79193ee2dbSKelvin Li unsigned B; 80193ee2dbSKelvin Li float Arr[100]; 81193ee2dbSKelvin Li float *Ptr; fooSB82193ee2dbSKelvin Li float *foo() { 83193ee2dbSKelvin Li return &Arr[0]; 84193ee2dbSKelvin Li } 85193ee2dbSKelvin Li }; 86193ee2dbSKelvin Li 87193ee2dbSKelvin Li struct SC { 88193ee2dbSKelvin Li unsigned A : 2; 89193ee2dbSKelvin Li unsigned B : 3; 90193ee2dbSKelvin Li unsigned C; 91193ee2dbSKelvin Li unsigned D; 92193ee2dbSKelvin Li float Arr[100]; 93193ee2dbSKelvin Li SB S; 94193ee2dbSKelvin Li SB ArrS[100]; 95193ee2dbSKelvin Li SB *PtrS; 96193ee2dbSKelvin Li SB *&RPtrS; 97193ee2dbSKelvin Li float *Ptr; 98193ee2dbSKelvin Li SCSC99193ee2dbSKelvin Li SC(SB *&_RPtrS) : RPtrS(_RPtrS) {} 100193ee2dbSKelvin Li }; 101193ee2dbSKelvin Li 102193ee2dbSKelvin Li union SD { 103193ee2dbSKelvin Li unsigned A; 104193ee2dbSKelvin Li float B; 105193ee2dbSKelvin Li }; 106193ee2dbSKelvin Li 107193ee2dbSKelvin Li struct S1; 108193ee2dbSKelvin Li extern S1 a; 109193ee2dbSKelvin Li class S2 { 110193ee2dbSKelvin Li mutable int a; 111193ee2dbSKelvin Li public: S2()112193ee2dbSKelvin Li S2():a(0) { } S2(S2 & s2)113193ee2dbSKelvin Li S2(S2 &s2):a(s2.a) { } 114193ee2dbSKelvin Li static float S2s; 115193ee2dbSKelvin Li static const float S2sc; 116193ee2dbSKelvin Li }; 117193ee2dbSKelvin Li const float S2::S2sc = 0; 118193ee2dbSKelvin Li const S2 b; 119193ee2dbSKelvin Li const S2 ba[5]; 120193ee2dbSKelvin Li class S3 { 121193ee2dbSKelvin Li int a; 122193ee2dbSKelvin Li public: S3()123193ee2dbSKelvin Li S3():a(0) { } S3(S3 & s3)124193ee2dbSKelvin Li S3(S3 &s3):a(s3.a) { } 125193ee2dbSKelvin Li }; 126193ee2dbSKelvin Li const S3 c; 127193ee2dbSKelvin Li const S3 ca[5]; 128193ee2dbSKelvin Li extern const int f; 129193ee2dbSKelvin Li class S4 { 130193ee2dbSKelvin Li int a; 131193ee2dbSKelvin Li S4(); 132193ee2dbSKelvin Li S4(const S4 &s4); 133193ee2dbSKelvin Li public: S4(int v)134193ee2dbSKelvin Li S4(int v):a(v) { } 135193ee2dbSKelvin Li }; 136193ee2dbSKelvin Li class S5 { 137193ee2dbSKelvin Li int a; S5()138193ee2dbSKelvin Li S5():a(0) {} S5(const S5 & s5)139193ee2dbSKelvin Li S5(const S5 &s5):a(s5.a) { } 140193ee2dbSKelvin Li public: S5(int v)141193ee2dbSKelvin Li S5(int v):a(v) { } 142193ee2dbSKelvin Li }; 143193ee2dbSKelvin Li 144193ee2dbSKelvin Li S3 h; 145193ee2dbSKelvin Li #pragma omp threadprivate(h) 146193ee2dbSKelvin Li 147193ee2dbSKelvin Li typedef struct { 148193ee2dbSKelvin Li int a; 149193ee2dbSKelvin Li } S6; 150193ee2dbSKelvin Li 151193ee2dbSKelvin Li template <typename T> tmain(T argc)152193ee2dbSKelvin LiT tmain(T argc) { 153193ee2dbSKelvin Li const T da[5] = { 0 }; 154193ee2dbSKelvin Li S6 h[10]; 155193ee2dbSKelvin Li auto &rh = h; 156193ee2dbSKelvin Li T i; 157193ee2dbSKelvin Li T &j = i; 158193ee2dbSKelvin Li T *k = &j; 159193ee2dbSKelvin Li T *&z = k; 160193ee2dbSKelvin Li T aa[10]; 161193ee2dbSKelvin Li auto &raa = aa; 162193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(k) 163193ee2dbSKelvin Li {} 164193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(z) 165193ee2dbSKelvin Li {} 166193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(aa) 167193ee2dbSKelvin Li {} 168193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(raa) 169193ee2dbSKelvin Li {} 170193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(h) 171193ee2dbSKelvin Li {} 172193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(rh) 173193ee2dbSKelvin Li {} 174193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(da) 175193ee2dbSKelvin Li {} 176193ee2dbSKelvin Li return 0; 177193ee2dbSKelvin Li } 178193ee2dbSKelvin Li 179193ee2dbSKelvin Li // CHECK: template<> int tmain<int>(int argc) { 180193ee2dbSKelvin Li // CHECK-NEXT: const int da[5] = {0}; 181193ee2dbSKelvin Li // CHECK-NEXT: S6 h[10]; 182193ee2dbSKelvin Li // CHECK-NEXT: auto &rh = h; 183193ee2dbSKelvin Li // CHECK-NEXT: int i; 184193ee2dbSKelvin Li // CHECK-NEXT: int &j = i; 185193ee2dbSKelvin Li // CHECK-NEXT: int *k = &j; 186193ee2dbSKelvin Li // CHECK-NEXT: int *&z = k; 187193ee2dbSKelvin Li // CHECK-NEXT: int aa[10]; 188193ee2dbSKelvin Li // CHECK-NEXT: auto &raa = aa; 189193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(k) 190193ee2dbSKelvin Li // CHECK-NEXT: { 191193ee2dbSKelvin Li // CHECK-NEXT: } 192193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(z) 193193ee2dbSKelvin Li // CHECK-NEXT: { 194193ee2dbSKelvin Li // CHECK-NEXT: } 195193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(aa) 196193ee2dbSKelvin Li // CHECK-NEXT: { 197193ee2dbSKelvin Li // CHECK-NEXT: } 198193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(raa) 199193ee2dbSKelvin Li // CHECK-NEXT: { 200193ee2dbSKelvin Li // CHECK-NEXT: } 201193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(h) 202193ee2dbSKelvin Li // CHECK-NEXT: { 203193ee2dbSKelvin Li // CHECK-NEXT: } 204193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(rh) 205193ee2dbSKelvin Li // CHECK-NEXT: { 206193ee2dbSKelvin Li // CHECK-NEXT: } 207193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(da) 208193ee2dbSKelvin Li 209193ee2dbSKelvin Li // CHECK: template<> int *tmain<int *>(int *argc) { 210193ee2dbSKelvin Li // CHECK-NEXT: int *const da[5] = {0}; 211193ee2dbSKelvin Li // CHECK-NEXT: S6 h[10]; 212193ee2dbSKelvin Li // CHECK-NEXT: auto &rh = h; 213193ee2dbSKelvin Li // CHECK-NEXT: int *i; 214193ee2dbSKelvin Li // CHECK-NEXT: int *&j = i; 215193ee2dbSKelvin Li // CHECK-NEXT: int **k = &j; 216193ee2dbSKelvin Li // CHECK-NEXT: int **&z = k; 217193ee2dbSKelvin Li // CHECK-NEXT: int *aa[10]; 218193ee2dbSKelvin Li // CHECK-NEXT: auto &raa = aa; 219193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(k) 220193ee2dbSKelvin Li // CHECK-NEXT: { 221193ee2dbSKelvin Li // CHECK-NEXT: } 222193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(z) 223193ee2dbSKelvin Li // CHECK-NEXT: { 224193ee2dbSKelvin Li // CHECK-NEXT: } 225193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(aa) 226193ee2dbSKelvin Li // CHECK-NEXT: { 227193ee2dbSKelvin Li // CHECK-NEXT: } 228193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(raa) 229193ee2dbSKelvin Li // CHECK-NEXT: { 230193ee2dbSKelvin Li // CHECK-NEXT: } 231193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(h) 232193ee2dbSKelvin Li // CHECK-NEXT: { 233193ee2dbSKelvin Li // CHECK-NEXT: } 234193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(rh) 235193ee2dbSKelvin Li // CHECK-NEXT: { 236193ee2dbSKelvin Li // CHECK-NEXT: } 237193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(da) 238193ee2dbSKelvin Li 239193ee2dbSKelvin Li // CHECK-LABEL: int main(int argc, char **argv) { main(int argc,char ** argv)240193ee2dbSKelvin Liint main(int argc, char **argv) { 241193ee2dbSKelvin Li const int da[5] = { 0 }; 242193ee2dbSKelvin Li S6 h[10]; 243193ee2dbSKelvin Li auto &rh = h; 244193ee2dbSKelvin Li int i; 245193ee2dbSKelvin Li int &j = i; 246193ee2dbSKelvin Li int *k = &j; 247193ee2dbSKelvin Li int *&z = k; 248193ee2dbSKelvin Li int aa[10]; 249193ee2dbSKelvin Li auto &raa = aa; 250193ee2dbSKelvin Li // CHECK-NEXT: const int da[5] = {0}; 251193ee2dbSKelvin Li // CHECK-NEXT: S6 h[10]; 252193ee2dbSKelvin Li // CHECK-NEXT: auto &rh = h; 253193ee2dbSKelvin Li // CHECK-NEXT: int i; 254193ee2dbSKelvin Li // CHECK-NEXT: int &j = i; 255193ee2dbSKelvin Li // CHECK-NEXT: int *k = &j; 256193ee2dbSKelvin Li // CHECK-NEXT: int *&z = k; 257193ee2dbSKelvin Li // CHECK-NEXT: int aa[10]; 258193ee2dbSKelvin Li // CHECK-NEXT: auto &raa = aa; 259193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(k) 260193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(k) 261193ee2dbSKelvin Li {} 262193ee2dbSKelvin Li // CHECK-NEXT: { 263193ee2dbSKelvin Li // CHECK-NEXT: } 264193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(z) 265193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(z) 266193ee2dbSKelvin Li {} 267193ee2dbSKelvin Li // CHECK-NEXT: { 268193ee2dbSKelvin Li // CHECK-NEXT: } 269193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(aa) 270193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(aa) 271193ee2dbSKelvin Li {} 272193ee2dbSKelvin Li // CHECK-NEXT: { 273193ee2dbSKelvin Li // CHECK-NEXT: } 274193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(raa) 275193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(raa) 276193ee2dbSKelvin Li {} 277193ee2dbSKelvin Li // CHECK-NEXT: { 278193ee2dbSKelvin Li // CHECK-NEXT: } 279193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(h) 280193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(h) 281193ee2dbSKelvin Li {} 282193ee2dbSKelvin Li // CHECK-NEXT: { 283193ee2dbSKelvin Li // CHECK-NEXT: } 284193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(rh) 285193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(rh) 286193ee2dbSKelvin Li {} 287193ee2dbSKelvin Li // CHECK-NEXT: { 288193ee2dbSKelvin Li // CHECK-NEXT: } 289193ee2dbSKelvin Li #pragma omp target parallel is_device_ptr(da) 290193ee2dbSKelvin Li // CHECK-NEXT: #pragma omp target parallel is_device_ptr(da) 291193ee2dbSKelvin Li {} 292193ee2dbSKelvin Li // CHECK-NEXT: { 293193ee2dbSKelvin Li // CHECK-NEXT: } 294193ee2dbSKelvin Li return tmain<int>(argc) + *tmain<int *>(&argc); 295193ee2dbSKelvin Li } 296193ee2dbSKelvin Li 297193ee2dbSKelvin Li 298193ee2dbSKelvin Li #endif 299