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 distribute parallel for private(a) private(this->a) private(T::a) 28 for (int k = 0; k < a.a; ++k) 29 ++this->a.a; 30 } 31 S7 &operator=(S7 &s) { 32 #pragma omp target 33 #pragma omp teams distribute parallel for private(a) private(this->a) 34 for (int k = 0; k < s.a.a; ++k) 35 ++s.a.a; 36 37 foo(); 38 return *this; 39 } 40 void foo() { 41 int b, argv, d, c, e, f; 42 #pragma omp target 43 #pragma omp teams distribute parallel for default(none), private(b) firstprivate(argv) shared(d) reduction(+:c) reduction(max:e) num_teams(f) thread_limit(d) 44 for (int k = 0; k < a.a; ++k) 45 ++a.a; 46 } 47 }; 48 // CHECK: #pragma omp target 49 // CHECK-NEXT: #pragma omp teams distribute parallel for private(this->a) private(this->a) private(T::a) 50 // CHECK: #pragma omp target 51 // CHECK-NEXT: #pragma omp teams distribute parallel for private(this->a) private(this->a) 52 // CHECK: #pragma omp target 53 // CHECK-NEXT: #pragma omp teams distribute parallel for default(none) private(b) firstprivate(argv) shared(d) reduction(+: c) reduction(max: e) num_teams(f) thread_limit(d) 54 55 class S8 : public S7<S> { 56 S8() {} 57 58 public: 59 S8(int v) : S7<S>(v){ 60 #pragma omp target 61 #pragma omp teams distribute parallel for private(a) private(this->a) private(S7<S>::a) 62 for (int k = 0; k < a.a; ++k) 63 ++this->a.a; 64 } 65 S8 &operator=(S8 &s) { 66 #pragma omp target 67 #pragma omp teams distribute parallel for private(a) private(this->a) 68 for (int k = 0; k < s.a.a; ++k) 69 ++s.a.a; 70 71 bar(); 72 return *this; 73 } 74 void bar() { 75 int b, argv, d, c, e, f8; 76 #pragma omp target 77 #pragma omp teams distribute parallel for default(none), private(b) firstprivate(argv) shared(d) reduction(+:c) reduction(max:e) num_teams(f8) thread_limit(d) 78 for (int k = 0; k < a.a; ++k) 79 ++a.a; 80 } 81 }; 82 // CHECK: #pragma omp target 83 // CHECK-NEXT: #pragma omp teams distribute parallel for private(this->a) private(this->a) private(this->S::a) 84 // CHECK: #pragma omp target 85 // CHECK-NEXT: #pragma omp teams distribute parallel for private(this->a) private(this->a) private(this->S7<S>::a) 86 // CHECK: #pragma omp target 87 // CHECK-NEXT: #pragma omp teams distribute parallel for private(this->a) private(this->a) 88 // CHECK: #pragma omp target 89 // CHECK-NEXT: #pragma omp teams distribute parallel for default(none) private(b) firstprivate(argv) shared(d) reduction(+: c) reduction(max: e) num_teams(f8) thread_limit(d) 90 91 template <class T, int N> 92 T tmain(T argc) { 93 T b = argc, c, d, e, f, g; 94 static T a; 95 // CHECK: static T a; 96 const T clen = 5; 97 const T alen = 16; 98 int arr[10]; 99 #pragma omp target 100 #pragma omp teams distribute parallel for 101 for (int i=0; i < 2; ++i) 102 a = 2; 103 // CHECK: #pragma omp target 104 // CHECK-NEXT: #pragma omp teams distribute parallel for 105 // CHECK-NEXT: for (int i = 0; i < 2; ++i) 106 // CHECK-NEXT: a = 2; 107 #pragma omp target 108 #pragma omp teams distribute parallel for private(argc, b), firstprivate(c, d), collapse(2) 109 for (int i = 0; i < 10; ++i) 110 for (int j = 0; j < 10; ++j) 111 foo(); 112 // CHECK: #pragma omp target 113 // CHECK-NEXT: #pragma omp teams distribute parallel for private(argc,b) firstprivate(c,d) collapse(2) 114 // CHECK-NEXT: for (int i = 0; i < 10; ++i) 115 // CHECK-NEXT: for (int j = 0; j < 10; ++j) 116 // CHECK-NEXT: foo(); 117 for (int i = 0; i < 10; ++i) 118 foo(); 119 // CHECK: for (int i = 0; i < 10; ++i) 120 // CHECK-NEXT: foo(); 121 #pragma omp target 122 #pragma omp teams distribute parallel for 123 for (int i = 0; i < 10; ++i) 124 foo(); 125 // CHECK: #pragma omp target 126 // CHECK-NEXT: #pragma omp teams distribute parallel for 127 // CHECK-NEXT: for (int i = 0; i < 10; ++i) 128 // CHECK-NEXT: foo(); 129 #pragma omp target 130 #pragma omp teams distribute parallel for default(none), private(b) firstprivate(argc) shared(d) reduction(+:c) reduction(max:e) num_teams(f) thread_limit(d) 131 for (int k = 0; k < 10; ++k) 132 e += d + argc; 133 // CHECK: #pragma omp target 134 // CHECK-NEXT: #pragma omp teams distribute parallel for default(none) private(b) firstprivate(argc) shared(d) reduction(+: c) reduction(max: e) num_teams(f) thread_limit(d) 135 // CHECK-NEXT: for (int k = 0; k < 10; ++k) 136 // CHECK-NEXT: e += d + argc; 137 #pragma omp target 138 #pragma omp teams distribute parallel for linear(d) 139 for (int k = 0; k < 10; ++k) 140 e += d + argc; 141 // CHECK: #pragma omp target 142 // CHECK-NEXT: #pragma omp teams distribute parallel for linear(d) 143 // CHECK-NEXT: for (int k = 0; k < 10; ++k) 144 // CHECK-NEXT: e += d + argc; 145 return T(); 146 } 147 148 int main (int argc, char **argv) { 149 int b = argc, c, d, e, f, g; 150 static int a; 151 // CHECK: static int a; 152 const int clen = 5; 153 const int N = 10; 154 int arr[10]; 155 #pragma omp target 156 #pragma omp teams distribute parallel for 157 for (int i=0; i < 2; ++i) 158 a = 2; 159 // CHECK: #pragma omp target 160 // CHECK-NEXT: #pragma omp teams distribute parallel for 161 // CHECK-NEXT: for (int i = 0; i < 2; ++i) 162 // CHECK-NEXT: a = 2; 163 #pragma omp target 164 #pragma omp teams distribute parallel for private(argc,b),firstprivate(argv, c), collapse(2) 165 for (int i = 0; i < 10; ++i) 166 for (int j = 0; j < 10; ++j) 167 foo(); 168 // CHECK: #pragma omp target 169 // CHECK-NEXT: #pragma omp teams distribute parallel for private(argc,b) firstprivate(argv,c) collapse(2) 170 // CHECK-NEXT: for (int i = 0; i < 10; ++i) 171 // CHECK-NEXT: for (int j = 0; j < 10; ++j) 172 // CHECK-NEXT: foo(); 173 for (int i = 0; i < 10; ++i) 174 foo(); 175 // CHECK: for (int i = 0; i < 10; ++i) 176 // CHECK-NEXT: foo(); 177 #pragma omp target 178 #pragma omp teams distribute parallel for 179 for (int i = 0; i < 10; ++i)foo(); 180 // CHECK: #pragma omp target 181 // CHECK-NEXT: #pragma omp teams distribute parallel for 182 // CHECK-NEXT: for (int i = 0; i < 10; ++i) 183 // CHECK-NEXT: foo(); 184 #pragma omp target 185 #pragma omp teams distribute parallel for default(none), private(b) firstprivate(argc) shared(d) reduction(+:c) reduction(max:e) num_teams(f) thread_limit(d) 186 for (int k = 0; k < 10; ++k) 187 e += d + argc; 188 // CHECK: #pragma omp target 189 // CHECK-NEXT: #pragma omp teams distribute parallel for default(none) private(b) firstprivate(argc) shared(d) reduction(+: c) reduction(max: e) num_teams(f) thread_limit(d) 190 // CHECK-NEXT: for (int k = 0; k < 10; ++k) 191 // CHECK-NEXT: e += d + argc; 192 #pragma omp target 193 #pragma omp teams distribute parallel for linear(d) 194 for (int k = 0; k < 10; ++k) 195 e += d + argc; 196 // CHECK: #pragma omp target 197 // CHECK-NEXT: #pragma omp teams distribute parallel for linear(d) 198 // CHECK-NEXT: for (int k = 0; k < 10; ++k) 199 // CHECK-NEXT: e += d + argc; 200 return (0); 201 } 202 203 #endif 204