Home | History | Annotate | Download | only in OpenMP
      1 // RUN: %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 // expected-no-diagnostics
      5 
      6 #ifndef HEADER
      7 #define HEADER
      8 
      9 struct ST {
     10   int *a;
     11 };
     12 typedef int arr[10];
     13 typedef ST STarr[10];
     14 struct SA {
     15   const int da[5] = { 0 };
     16   ST g[10];
     17   STarr &rg = g;
     18   int i;
     19   int &j = i;
     20   int *k = &j;
     21   int *&z = k;
     22   int aa[10];
     23   arr &raa = aa;
     24   void func(int arg) {
     25 #pragma omp target is_device_ptr(k)
     26     {}
     27 #pragma omp target is_device_ptr(z)
     28     {}
     29 #pragma omp target is_device_ptr(aa) // OK
     30     {}
     31 #pragma omp target is_device_ptr(raa) // OK
     32     {}
     33 #pragma omp target is_device_ptr(g) // OK
     34     {}
     35 #pragma omp target is_device_ptr(rg) // OK
     36     {}
     37 #pragma omp target is_device_ptr(da) // OK
     38     {}
     39   return;
     40  }
     41 };
     42 // CHECK: struct SA
     43 // CHECK-NEXT: const int da[5] = {0};
     44 // CHECK-NEXT: ST g[10];
     45 // CHECK-NEXT: STarr &rg = this->g;
     46 // CHECK-NEXT: int i;
     47 // CHECK-NEXT: int &j = this->i;
     48 // CHECK-NEXT: int *k = &this->j;
     49 // CHECK-NEXT: int *&z = this->k;
     50 // CHECK-NEXT: int aa[10];
     51 // CHECK-NEXT: arr &raa = this->aa;
     52 // CHECK-NEXT: func(
     53 // CHECK-NEXT: #pragma omp target is_device_ptr(this->k)
     54 // CHECK-NEXT: {
     55 // CHECK-NEXT: }
     56 // CHECK-NEXT: #pragma omp target is_device_ptr(this->z)
     57 // CHECK-NEXT: {
     58 // CHECK-NEXT: }
     59 // CHECK-NEXT: #pragma omp target is_device_ptr(this->aa)
     60 // CHECK-NEXT: {
     61 // CHECK-NEXT: }
     62 // CHECK-NEXT: #pragma omp target is_device_ptr(this->raa)
     63 // CHECK-NEXT: {
     64 // CHECK-NEXT: }
     65 // CHECK-NEXT: #pragma omp target is_device_ptr(this->g)
     66 // CHECK-NEXT: {
     67 // CHECK-NEXT: }
     68 // CHECK-NEXT: #pragma omp target is_device_ptr(this->rg)
     69 // CHECK-NEXT: {
     70 // CHECK-NEXT: }
     71 // CHECK-NEXT: #pragma omp target is_device_ptr(this->da)
     72 
     73 struct SB {
     74   unsigned A;
     75   unsigned B;
     76   float Arr[100];
     77   float *Ptr;
     78   float *foo() {
     79     return &Arr[0];
     80   }
     81 };
     82 
     83 struct SC {
     84   unsigned A : 2;
     85   unsigned B : 3;
     86   unsigned C;
     87   unsigned D;
     88   float Arr[100];
     89   SB S;
     90   SB ArrS[100];
     91   SB *PtrS;
     92   SB *&RPtrS;
     93   float *Ptr;
     94 
     95   SC(SB *&_RPtrS) : RPtrS(_RPtrS) {}
     96 };
     97 
     98 union SD {
     99   unsigned A;
    100   float B;
    101 };
    102 
    103 struct S1;
    104 extern S1 a;
    105 class S2 {
    106   mutable int a;
    107 public:
    108   S2():a(0) { }
    109   S2(S2 &s2):a(s2.a) { }
    110   static float S2s;
    111   static const float S2sc;
    112 };
    113 const float S2::S2sc = 0;
    114 const S2 b;
    115 const S2 ba[5];
    116 class S3 {
    117   int a;
    118 public:
    119   S3():a(0) { }
    120   S3(S3 &s3):a(s3.a) { }
    121 };
    122 const S3 c;
    123 const S3 ca[5];
    124 extern const int f;
    125 class S4 {
    126   int a;
    127   S4();
    128   S4(const S4 &s4);
    129 public:
    130   S4(int v):a(v) { }
    131 };
    132 class S5 {
    133   int a;
    134   S5():a(0) {}
    135   S5(const S5 &s5):a(s5.a) { }
    136 public:
    137   S5(int v):a(v) { }
    138 };
    139 
    140 S3 h;
    141 #pragma omp threadprivate(h)
    142 
    143 typedef struct {
    144   int a;
    145 } S6;
    146 
    147 template <typename T>
    148 T tmain(T argc) {
    149   const T da[5] = { 0 };
    150   S6 h[10];
    151   auto &rh = h;
    152   T i;
    153   T &j = i;
    154   T *k = &j;
    155   T *&z = k;
    156   T aa[10];
    157   auto &raa = aa;
    158 #pragma omp target is_device_ptr(k)
    159   {}
    160 #pragma omp target is_device_ptr(z)
    161   {}
    162 #pragma omp target is_device_ptr(aa)
    163   {}
    164 #pragma omp target is_device_ptr(raa)
    165   {}
    166 #pragma omp target is_device_ptr(h)
    167   {}
    168 #pragma omp target is_device_ptr(rh)
    169   {}
    170 #pragma omp target is_device_ptr(da)
    171   {}
    172   return 0;
    173 }
    174 
    175 // CHECK: template <typename T = int> int tmain(int argc) {
    176 // CHECK-NEXT: const int da[5] = {0};
    177 // CHECK-NEXT: S6 h[10];
    178 // CHECK-NEXT: auto &rh = h;
    179 // CHECK-NEXT: int i;
    180 // CHECK-NEXT: int &j = i;
    181 // CHECK-NEXT: int *k = &j;
    182 // CHECK-NEXT: int *&z = k;
    183 // CHECK-NEXT: int aa[10];
    184 // CHECK-NEXT: auto &raa = aa;
    185 // CHECK-NEXT: #pragma omp target is_device_ptr(k)
    186 // CHECK-NEXT: {
    187 // CHECK-NEXT: }
    188 // CHECK-NEXT: #pragma omp target is_device_ptr(z)
    189 // CHECK-NEXT: {
    190 // CHECK-NEXT: }
    191 // CHECK-NEXT: #pragma omp target is_device_ptr(aa)
    192 // CHECK-NEXT: {
    193 // CHECK-NEXT: }
    194 // CHECK-NEXT: #pragma omp target is_device_ptr(raa)
    195 // CHECK-NEXT: {
    196 // CHECK-NEXT: }
    197 // CHECK-NEXT: #pragma omp target is_device_ptr(h)
    198 // CHECK-NEXT: {
    199 // CHECK-NEXT: }
    200 // CHECK-NEXT: #pragma omp target is_device_ptr(rh)
    201 // CHECK-NEXT: {
    202 // CHECK-NEXT: }
    203 // CHECK-NEXT: #pragma omp target is_device_ptr(da)
    204 
    205 // CHECK: template <typename T = int *> int *tmain(int *argc) {
    206 // CHECK-NEXT: int *const da[5] = {0};
    207 // CHECK-NEXT: S6 h[10];
    208 // CHECK-NEXT: auto &rh = h;
    209 // CHECK-NEXT: int *i;
    210 // CHECK-NEXT: int *&j = i;
    211 // CHECK-NEXT: int **k = &j;
    212 // CHECK-NEXT: int **&z = k;
    213 // CHECK-NEXT: int *aa[10];
    214 // CHECK-NEXT: auto &raa = aa;
    215 // CHECK-NEXT: #pragma omp target is_device_ptr(k)
    216 // CHECK-NEXT: {
    217 // CHECK-NEXT: }
    218 // CHECK-NEXT: #pragma omp target is_device_ptr(z)
    219 // CHECK-NEXT: {
    220 // CHECK-NEXT: }
    221 // CHECK-NEXT: #pragma omp target is_device_ptr(aa)
    222 // CHECK-NEXT: {
    223 // CHECK-NEXT: }
    224 // CHECK-NEXT: #pragma omp target is_device_ptr(raa)
    225 // CHECK-NEXT: {
    226 // CHECK-NEXT: }
    227 // CHECK-NEXT: #pragma omp target is_device_ptr(h)
    228 // CHECK-NEXT: {
    229 // CHECK-NEXT: }
    230 // CHECK-NEXT: #pragma omp target is_device_ptr(rh)
    231 // CHECK-NEXT: {
    232 // CHECK-NEXT: }
    233 // CHECK-NEXT: #pragma omp target is_device_ptr(da)
    234 
    235 // CHECK-LABEL: int main(int argc, char **argv) {
    236 int main(int argc, char **argv) {
    237   const int da[5] = { 0 };
    238   S6 h[10];
    239   auto &rh = h;
    240   int i;
    241   int &j = i;
    242   int *k = &j;
    243   int *&z = k;
    244   int aa[10];
    245   auto &raa = aa;
    246 // CHECK-NEXT: const int da[5] = {0};
    247 // CHECK-NEXT: S6 h[10];
    248 // CHECK-NEXT: auto &rh = h;
    249 // CHECK-NEXT: int i;
    250 // CHECK-NEXT: int &j = i;
    251 // CHECK-NEXT: int *k = &j;
    252 // CHECK-NEXT: int *&z = k;
    253 // CHECK-NEXT: int aa[10];
    254 // CHECK-NEXT: auto &raa = aa;
    255 #pragma omp target is_device_ptr(k)
    256 // CHECK-NEXT: #pragma omp target is_device_ptr(k)
    257   {}
    258 // CHECK-NEXT: {
    259 // CHECK-NEXT: }
    260 #pragma omp target is_device_ptr(z)
    261 // CHECK-NEXT: #pragma omp target is_device_ptr(z)
    262   {}
    263 // CHECK-NEXT: {
    264 // CHECK-NEXT: }
    265 #pragma omp target is_device_ptr(aa)
    266 // CHECK-NEXT: #pragma omp target is_device_ptr(aa)
    267   {}
    268 // CHECK-NEXT: {
    269 // CHECK-NEXT: }
    270 #pragma omp target is_device_ptr(raa)
    271 // CHECK-NEXT: #pragma omp target is_device_ptr(raa)
    272   {}
    273 // CHECK-NEXT: {
    274 // CHECK-NEXT: }
    275 #pragma omp target is_device_ptr(h)
    276 // CHECK-NEXT: #pragma omp target is_device_ptr(h)
    277   {}
    278 // CHECK-NEXT: {
    279 // CHECK-NEXT: }
    280 #pragma omp target is_device_ptr(rh)
    281 // CHECK-NEXT: #pragma omp target is_device_ptr(rh)
    282   {}
    283 // CHECK-NEXT: {
    284 // CHECK-NEXT: }
    285 #pragma omp target is_device_ptr(da)
    286 // CHECK-NEXT: #pragma omp target is_device_ptr(da)
    287   {}
    288 // CHECK-NEXT: {
    289 // CHECK-NEXT: }
    290   return tmain<int>(argc) + *tmain<int *>(&argc);
    291 }
    292 
    293 
    294 #endif
    295