1 // RxUN: %clang_cc1 -verify -fopenmp -std=c++11 -ast-print %s | FileCheck %s 2 // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s 3 // RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s 4 5 // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -emit-pch -o %t %s 6 // RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s 7 // expected-no-diagnostics 8 9 #ifndef HEADER 10 #define HEADER 11 12 struct ST { 13 int *a; 14 }; 15 struct SA { 16 int i, j; 17 int *k = &j; 18 int *&z = k; funcSA19 void func(int arg) { 20 #pragma omp target data map(tofrom: i) use_device_ptr(k) 21 {} 22 #pragma omp target data map(tofrom: i) use_device_ptr(z) 23 {} 24 return; 25 } 26 }; 27 // CHECK: struct SA 28 // CHECK: void func( 29 // CHECK: #pragma omp target data map(tofrom: this->i) use_device_ptr(this->k){{$}} 30 // CHECK: #pragma omp target data map(tofrom: this->i) use_device_ptr(this->z) 31 struct SB { 32 unsigned A; 33 unsigned B; 34 float Arr[100]; 35 float *Ptr; fooSB36 float *foo() { 37 return &Arr[0]; 38 } 39 }; 40 41 struct SC { 42 unsigned A : 2; 43 unsigned B : 3; 44 unsigned C; 45 unsigned D; 46 float Arr[100]; 47 SB S; 48 SB ArrS[100]; 49 SB *PtrS; 50 SB *&RPtrS; 51 float *Ptr; 52 SCSC53 SC(SB *&_RPtrS) : RPtrS(_RPtrS) {} 54 }; 55 56 union SD { 57 unsigned A; 58 float B; 59 }; 60 61 struct S1; 62 extern S1 a; 63 class S2 { 64 mutable int a; 65 public: S2()66 S2():a(0) { } S2(S2 & s2)67 S2(S2 &s2):a(s2.a) { } 68 static float S2s; 69 static const float S2sc; 70 }; 71 const float S2::S2sc = 0; 72 const S2 b; 73 const S2 ba[5]; 74 class S3 { 75 int a; 76 public: S3()77 S3():a(0) { } S3(S3 & s3)78 S3(S3 &s3):a(s3.a) { } 79 }; 80 const S3 c; 81 const S3 ca[5]; 82 extern const int f; 83 class S4 { 84 int a; 85 S4(); 86 S4(const S4 &s4); 87 public: S4(int v)88 S4(int v):a(v) { } 89 }; 90 class S5 { 91 int a; S5()92 S5():a(0) {} S5(const S5 & s5)93 S5(const S5 &s5):a(s5.a) { } 94 public: S5(int v)95 S5(int v):a(v) { } 96 }; 97 98 S3 h; 99 #pragma omp threadprivate(h) 100 101 typedef int from; 102 103 template <typename T> tmain(T argc)104T tmain(T argc) { 105 T i; 106 T &j = i; 107 T *k = &j; 108 T *&z = k; 109 #pragma omp target data map(tofrom: i) use_device_ptr(k) 110 {} 111 #pragma omp target data map(tofrom: i) use_device_ptr(z) 112 {} 113 return 0; 114 } 115 116 // CHECK: template<> int tmain<int>(int argc) { 117 // CHECK-NEXT: int i; 118 // CHECK-NEXT: int &j = i; 119 // CHECK-NEXT: int *k = &j; 120 // CHECK-NEXT: int *&z = k; 121 // CHECK-NEXT: #pragma omp target data map(tofrom: i) use_device_ptr(k) 122 // CHECK-NEXT: { 123 // CHECK-NEXT: } 124 // CHECK-NEXT: #pragma omp target data map(tofrom: i) use_device_ptr(z) 125 126 // CHECK: template<> int *tmain<int *>(int *argc) { 127 // CHECK-NEXT: int *i; 128 // CHECK-NEXT: int *&j = i; 129 // CHECK-NEXT: int **k = &j; 130 // CHECK-NEXT: int **&z = k; 131 // CHECK-NEXT: #pragma omp target data map(tofrom: i) use_device_ptr(k) 132 // CHECK-NEXT: { 133 // CHECK-NEXT: } 134 // CHECK-NEXT: #pragma omp target data map(tofrom: i) use_device_ptr(z) 135 136 // CHECK-LABEL: int main(int argc, char **argv) { main(int argc,char ** argv)137int main(int argc, char **argv) { 138 int i; 139 int &j = i; 140 int *k = &j; 141 int *&z = k; 142 // CHECK-NEXT: int i; 143 // CHECK-NEXT: int &j = i; 144 // CHECK-NEXT: int *k = &j; 145 // CHECK-NEXT: int *&z = k; 146 #pragma omp target data map(tofrom: i) use_device_ptr(k) 147 // CHECK-NEXT: #pragma omp target data map(tofrom: i) use_device_ptr(k) 148 {} 149 // CHECK-NEXT: { 150 // CHECK-NEXT: } 151 #pragma omp target data map(tofrom: i) use_device_ptr(z) 152 // CHECK-NEXT: #pragma omp target data map(tofrom: i) use_device_ptr(z) 153 {} 154 return tmain<int>(argc) + (*tmain<int*>(&argc)); 155 } 156 157 #endif 158