1 // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -std=c++11 -o - %s
2 
3 void foo() {
4 }
5 
6 #pragma omp distribute parallel for // expected-error {{unexpected OpenMP directive '#pragma omp distribute parallel for'}}
7 
8 int main(int argc, char **argv) {
9 #pragma omp target
10 #pragma omp teams
11 #pragma omp distribute parallel for { // expected-warning {{extra tokens at the end of '#pragma omp distribute parallel for' are ignored}}
12   for (int i = 0; i < argc; ++i)
13     foo();
14 #pragma omp target
15 #pragma omp teams
16 #pragma omp distribute parallel for ( // expected-warning {{extra tokens at the end of '#pragma omp distribute parallel for' are ignored}}
17   for (int i = 0; i < argc; ++i)
18     foo();
19 #pragma omp target
20 #pragma omp teams
21 #pragma omp distribute parallel for[ // expected-warning {{extra tokens at the end of '#pragma omp distribute parallel for' are ignored}}
22   for (int i = 0; i < argc; ++i)
23     foo();
24 #pragma omp target
25 #pragma omp teams
26 #pragma omp distribute parallel for] // expected-warning {{extra tokens at the end of '#pragma omp distribute parallel for' are ignored}}
27   for (int i = 0; i < argc; ++i)
28     foo();
29 #pragma omp target
30 #pragma omp teams
31 #pragma omp distribute parallel for) // expected-warning {{extra tokens at the end of '#pragma omp distribute parallel for' are ignored}}
32   for (int i = 0; i < argc; ++i)
33     foo();
34 #pragma omp target
35 #pragma omp teams
36 #pragma omp distribute parallel for } // expected-warning {{extra tokens at the end of '#pragma omp distribute parallel for' are ignored}}
37   for (int i = 0; i < argc; ++i)
38     foo();
39 #pragma omp target
40 #pragma omp teams
41 #pragma omp distribute parallel for
42   for (int i = 0; i < argc; ++i)
43     foo();
44 #pragma omp target
45 #pragma omp teams
46 #pragma omp distribute parallel for unknown()   // expected-warning {{extra tokens at the end of '#pragma omp distribute parallel for' are ignored}}
47   for (int i = 0; i < argc; ++i)
48     foo();
49 L1:
50   for (int i = 0; i < argc; ++i)
51     foo();
52 #pragma omp target
53 #pragma omp teams
54 #pragma omp distribute parallel for
55   for (int i = 0; i < argc; ++i)
56     foo();
57 #pragma omp target
58 #pragma omp teams
59 #pragma omp distribute parallel for
60   for (int i = 0; i < argc; ++i) {
61     goto L1; // expected-error {{use of undeclared label 'L1'}}
62     argc++;
63   }
64 
65   for (int i = 0; i < 10; ++i) {
66     switch (argc) {
67     case (0):
68 #pragma omp target
69 #pragma omp teams
70 #pragma omp distribute parallel for
71       for (int i = 0; i < argc; ++i) {
72         foo();
73         break; // expected-error {{'break' statement cannot be used in OpenMP for loop}}
74         continue;
75       }
76     default:
77       break;
78     }
79   }
80 #pragma omp target
81 #pragma omp teams
82 #pragma omp distribute parallel for default(none)
83   for (int i = 0; i < 10; ++i)
84     ++argc; // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
85 
86   goto L2; // expected-error {{use of undeclared label 'L2'}}
87 #pragma omp target
88 #pragma omp teams
89 #pragma omp distribute parallel for
90   for (int i = 0; i < argc; ++i)
91   L2:
92   foo();
93 #pragma omp target
94 #pragma omp teams
95 #pragma omp distribute parallel for
96   for (int i = 0; i < argc; ++i) {
97     return 1; // expected-error {{cannot return from OpenMP region}}
98   }
99 
100   [[]] // expected-error {{an attribute list cannot appear here}}
101 #pragma omp target
102 #pragma omp teams
103 #pragma omp distribute parallel for
104       for (int n = 0; n < 100; ++n) {
105   }
106 
107   return 0;
108 }
109 
110 void test_ordered() {
111 #pragma omp target
112 #pragma omp teams
113 #pragma omp distribute parallel for collapse(2) collapse(3) // expected-error {{directive '#pragma omp distribute parallel for' cannot contain more than one 'collapse' clause}}
114   for (int i = 0; i < 16; ++i)
115     for (int j = 0; j < 16; ++j)
116     ;
117 }
118 
119