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 template <class T>
12 T tmain (T argc) {
13   T b = argc, c, d, e, f, g;
14   static T a;
15   #pragma omp for ordered
16   for (int i =0 ; i < argc; ++i)
17   #pragma omp ordered
18   {
19     a=2;
20   }
21   #pragma omp for ordered
22   for (int i =0 ; i < argc; ++i)
23   #pragma omp ordered threads
24   {
25     a=2;
26   }
27   #pragma omp simd
28   for (int i =0 ; i < argc; ++i)
29   #pragma omp ordered simd
30   {
31     a=2;
32   }
33   #pragma omp for simd
34   for (int i =0 ; i < argc; ++i)
35   #pragma omp ordered simd
36   {
37     a=2;
38   }
39   #pragma omp parallel for simd
40   for (int i =0 ; i < argc; ++i)
41   #pragma omp ordered simd
42   {
43     a=2;
44   }
45   return (0);
46 }
47 
48 // CHECK: static int a;
49 // CHECK-NEXT: #pragma omp for ordered
50 // CHECK-NEXT: for (int i = 0; i < argc; ++i)
51 // CHECK-NEXT: #pragma omp ordered
52 // CHECK-NEXT: {
53 // CHECK-NEXT: a = 2;
54 // CHECK-NEXT: }
55 // CHECK-NEXT: #pragma omp for ordered
56 // CHECK-NEXT: for (int i = 0; i < argc; ++i)
57 // CHECK-NEXT: #pragma omp ordered threads
58 // CHECK-NEXT: {
59 // CHECK-NEXT: a = 2;
60 // CHECK-NEXT: }
61 // CHECK-NEXT: #pragma omp simd
62 // CHECK-NEXT: for (int i = 0; i < argc; ++i)
63 // CHECK-NEXT: #pragma omp ordered simd
64 // CHECK-NEXT: {
65 // CHECK-NEXT: a = 2;
66 // CHECK-NEXT: }
67 // CHECK-NEXT: #pragma omp for simd
68 // CHECK-NEXT: for (int i = 0; i < argc; ++i)
69 // CHECK-NEXT: #pragma omp ordered simd
70 // CHECK-NEXT: {
71 // CHECK-NEXT: a = 2;
72 // CHECK-NEXT: }
73 // CHECK-NEXT: #pragma omp parallel for simd
74 // CHECK-NEXT: for (int i = 0; i < argc; ++i)
75 // CHECK-NEXT: #pragma omp ordered simd
76 // CHECK-NEXT: {
77 // CHECK-NEXT: a = 2;
78 // CHECK-NEXT: }
79 
80 // CHECK: static T a;
81 // CHECK-NEXT: #pragma omp for ordered
82 // CHECK-NEXT: for (int i = 0; i < argc; ++i)
83 // CHECK-NEXT: #pragma omp ordered
84 // CHECK-NEXT: {
85 // CHECK-NEXT: a = 2;
86 // CHECK-NEXT: }
87 // CHECK-NEXT: #pragma omp for ordered
88 // CHECK-NEXT: for (int i = 0; i < argc; ++i)
89 // CHECK-NEXT: #pragma omp ordered threads
90 // CHECK-NEXT: {
91 // CHECK-NEXT: a = 2;
92 // CHECK-NEXT: }
93 // CHECK-NEXT: #pragma omp simd
94 // CHECK-NEXT: for (int i = 0; i < argc; ++i)
95 // CHECK-NEXT: #pragma omp ordered simd
96 // CHECK-NEXT: {
97 // CHECK-NEXT: a = 2;
98 // CHECK-NEXT: }
99 // CHECK-NEXT: #pragma omp for simd
100 // CHECK-NEXT: for (int i = 0; i < argc; ++i)
101 // CHECK-NEXT: #pragma omp ordered simd
102 // CHECK-NEXT: {
103 // CHECK-NEXT: a = 2;
104 // CHECK-NEXT: }
105 // CHECK-NEXT: #pragma omp parallel for simd
106 // CHECK-NEXT: for (int i = 0; i < argc; ++i)
107 // CHECK-NEXT: #pragma omp ordered simd
108 // CHECK-NEXT: {
109 // CHECK-NEXT: a = 2;
110 // CHECK-NEXT: }
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 for ordered
117   for (int i =0 ; i < argc; ++i)
118   #pragma omp ordered
119   {
120     a=2;
121   }
122   #pragma omp for ordered
123   for (int i =0 ; i < argc; ++i)
124   #pragma omp ordered threads
125   {
126     a=2;
127   }
128   #pragma omp simd
129   for (int i =0 ; i < argc; ++i)
130   #pragma omp ordered simd
131   {
132     a=2;
133   }
134   #pragma omp for simd
135   for (int i =0 ; i < argc; ++i)
136   #pragma omp ordered simd
137   {
138     a=2;
139   }
140   #pragma omp parallel for simd
141   for (int i =0 ; i < argc; ++i)
142   #pragma omp ordered simd
143   {
144     a=2;
145   }
146 // CHECK-NEXT: #pragma omp for ordered
147 // CHECK-NEXT: for (int i = 0; i < argc; ++i)
148 // CHECK-NEXT: #pragma omp ordered
149 // CHECK-NEXT: {
150 // CHECK-NEXT: a = 2;
151 // CHECK-NEXT: }
152 // CHECK-NEXT: #pragma omp for ordered
153 // CHECK-NEXT: for (int i = 0; i < argc; ++i)
154 // CHECK-NEXT: #pragma omp ordered threads
155 // CHECK-NEXT: {
156 // CHECK-NEXT: a = 2;
157 // CHECK-NEXT: }
158 // CHECK-NEXT: #pragma omp simd
159 // CHECK-NEXT: for (int i = 0; i < argc; ++i)
160 // CHECK-NEXT: #pragma omp ordered simd
161 // CHECK-NEXT: {
162 // CHECK-NEXT: a = 2;
163 // CHECK-NEXT: }
164 // CHECK-NEXT: #pragma omp for simd
165 // CHECK-NEXT: for (int i = 0; i < argc; ++i)
166 // CHECK-NEXT: #pragma omp ordered simd
167 // CHECK-NEXT: {
168 // CHECK-NEXT: a = 2;
169 // CHECK-NEXT: }
170 // CHECK-NEXT: #pragma omp parallel for simd
171 // CHECK-NEXT: for (int i = 0; i < argc; ++i)
172 // CHECK-NEXT: #pragma omp ordered simd
173 // CHECK-NEXT: {
174 // CHECK-NEXT: a = 2;
175 // CHECK-NEXT: }
176   return tmain(argc);
177 }
178 
179 #endif
180