Clang Project

clang_source_code/test/OpenMP/target_data_use_device_ptr_ast_print.cpp
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
12struct ST {
13  int *a;
14};
15struct SA {
16  int i, j;
17  int *k = &j;
18  int *&z = k;
19  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)
31struct SB {
32  unsigned A;
33  unsigned B;
34  float Arr[100];
35  float *Ptr;
36  float *foo() {
37    return &Arr[0];
38  }
39};
40
41struct 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
53  SC(SB *&_RPtrS) : RPtrS(_RPtrS) {}
54};
55
56union SD {
57  unsigned A;
58  float B;
59};
60
61struct S1;
62extern S1 a;
63class S2 {
64  mutable int a;
65public:
66  S2():a(0) { }
67  S2(S2 &s2):a(s2.a) { }
68  static float S2s;
69  static const float S2sc;
70};
71const float S2::S2sc = 0;
72const S2 b;
73const S2 ba[5];
74class S3 {
75  int a;
76public:
77  S3():a(0) { }
78  S3(S3 &s3):a(s3.a) { }
79};
80const S3 c;
81const S3 ca[5];
82extern const int f;
83class S4 {
84  int a;
85  S4();
86  S4(const S4 &s4);
87public:
88  S4(int v):a(v) { }
89};
90class S5 {
91  int a;
92  S5():a(0) {}
93  S5(const S5 &s5):a(s5.a) { }
94public:
95  S5(int v):a(v) { }
96};
97
98S3 h;
99#pragma omp threadprivate(h)
100
101typedef int from;
102
103template <typename T>
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) {
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