Clang Project

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