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)104 T 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)137 int 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