Home | History | Annotate | Download | only in OpenMP
      1 // RUN: %clang_cc1 -verify -fopenmp -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 void foo() {}
     10 
     11 struct S {
     12   S(): a(0) {}
     13   S(int v) : a(v) {}
     14   int a;
     15   typedef int type;
     16 };
     17 
     18 template <typename T>
     19 class S7 : public T {
     20 protected:
     21   T a;
     22   S7() : a(0) {}
     23 
     24 public:
     25   S7(typename T::type v) : a(v) {
     26 #pragma omp target
     27 #pragma omp teams
     28 #pragma omp distribute private(a) private(this->a) private(T::a)
     29     for (int k = 0; k < a.a; ++k)
     30       ++this->a.a;
     31   }
     32   S7 &operator=(S7 &s) {
     33 #pragma omp target
     34 #pragma omp teams
     35 #pragma omp distribute private(a) private(this->a)
     36     for (int k = 0; k < s.a.a; ++k)
     37       ++s.a.a;
     38     return *this;
     39   }
     40 };
     41 
     42 // CHECK: #pragma omp target
     43 // CHECK-NEXT: #pragma omp teams
     44 // CHECK-NEXT: #pragma omp distribute private(this->a) private(this->a) private(this->S::a)
     45 // CHECK: #pragma omp target
     46 // CHECK-NEXT: #pragma omp teams
     47 // CHECK-NEXT: #pragma omp distribute private(this->a) private(this->a) private(T::a)
     48 // CHECK: #pragma omp target
     49 // CHECK-NEXT: #pragma omp teams
     50 // CHECK-NEXT: #pragma omp distribute private(this->a) private(this->a)
     51 
     52 class S8 : public S7<S> {
     53   S8() {}
     54 
     55 public:
     56   S8(int v) : S7<S>(v){
     57 #pragma omp target
     58 #pragma omp teams
     59 #pragma omp distribute private(a) private(this->a) private(S7<S>::a)
     60     for (int k = 0; k < a.a; ++k)
     61       ++this->a.a;
     62   }
     63   S8 &operator=(S8 &s) {
     64 #pragma omp target
     65 #pragma omp teams
     66 #pragma omp distribute private(a) private(this->a)
     67     for (int k = 0; k < s.a.a; ++k)
     68       ++s.a.a;
     69     return *this;
     70   }
     71 };
     72 
     73 // CHECK: #pragma omp target
     74 // CHECK-NEXT: #pragma omp teams
     75 // CHECK-NEXT: #pragma omp distribute private(this->a) private(this->a) private(this->S7<S>::a)
     76 // CHECK: #pragma omp target
     77 // CHECK-NEXT: #pragma omp teams
     78 // CHECK-NEXT: #pragma omp distribute private(this->a) private(this->a)
     79 
     80 template <class T, int N>
     81 T tmain(T argc) {
     82   T b = argc, c, d, e, f, g;
     83   static T a;
     84 // CHECK: static T a;
     85 #pragma omp distribute
     86 // CHECK-NEXT: #pragma omp distribute
     87   for (int i=0; i < 2; ++i)a=2;
     88 // CHECK-NEXT: for (int i = 0; i < 2; ++i)
     89 // CHECK-NEXT: a = 2;
     90 #pragma omp target
     91 #pragma omp teams
     92 #pragma omp distribute private(argc, b), firstprivate(c, d), collapse(2)
     93   for (int i = 0; i < 10; ++i)
     94   for (int j = 0; j < 10; ++j)foo();
     95 // CHECK-NEXT: #pragma omp target
     96 // CHECK-NEXT: #pragma omp teams
     97 // CHECK-NEXT: #pragma omp distribute private(argc,b) firstprivate(c,d) collapse(2)
     98 // CHECK-NEXT: for (int i = 0; i < 10; ++i)
     99 // CHECK-NEXT: for (int j = 0; j < 10; ++j)
    100 // CHECK-NEXT: foo();
    101   for (int i = 0; i < 10; ++i)foo();
    102 // CHECK-NEXT: for (int i = 0; i < 10; ++i)
    103 // CHECK-NEXT: foo();
    104 #pragma omp distribute
    105 // CHECK: #pragma omp distribute
    106   for (int i = 0; i < 10; ++i)foo();
    107 // CHECK-NEXT: for (int i = 0; i < 10; ++i)
    108 // CHECK-NEXT: foo();
    109   return T();
    110 }
    111 
    112 int main (int argc, char **argv) {
    113   int b = argc, c, d, e, f, g;
    114   static int a;
    115 // CHECK: static int a;
    116 #pragma omp distribute
    117 // CHECK-NEXT: #pragma omp distribute
    118   for (int i=0; i < 2; ++i)a=2;
    119 // CHECK-NEXT: for (int i = 0; i < 2; ++i)
    120 // CHECK-NEXT: a = 2;
    121 #pragma omp target
    122 #pragma omp teams
    123 #pragma omp distribute private(argc,b),firstprivate(argv, c), collapse(2)
    124   for (int i = 0; i < 10; ++i)
    125   for (int j = 0; j < 10; ++j)foo();
    126 // CHECK-NEXT: #pragma omp target
    127 // CHECK-NEXT: #pragma omp teams
    128 // CHECK-NEXT: #pragma omp distribute private(argc,b) firstprivate(argv,c) collapse(2)
    129 // CHECK-NEXT: for (int i = 0; i < 10; ++i)
    130 // CHECK-NEXT: for (int j = 0; j < 10; ++j)
    131 // CHECK-NEXT: foo();
    132   for (int i = 0; i < 10; ++i)foo();
    133 // CHECK-NEXT: for (int i = 0; i < 10; ++i)
    134 // CHECK-NEXT: foo();
    135 #pragma omp distribute
    136 // CHECK: #pragma omp distribute
    137   for (int i = 0; i < 10; ++i)foo();
    138 // CHECK-NEXT: for (int i = 0; i < 10; ++i)
    139 // CHECK-NEXT: foo();
    140   return (0);
    141 }
    142 
    143 #endif
    144