1*0a7cc078SDavid Pagan // RUN: %clang_cc1 -verify=expected,omp50 -fopenmp -fopenmp-version=50 \
2*0a7cc078SDavid Pagan // RUN: -ferror-limit 100 %s -Wuninitialized
3*0a7cc078SDavid Pagan // RUN: %clang_cc1 -verify=expected,omp51 -fopenmp -fopenmp-version=51 \
4*0a7cc078SDavid Pagan // RUN: -ferror-limit 100 %s -Wuninitialized
5c112e941SAlexey Bataev 
6*0a7cc078SDavid Pagan // RUN: %clang_cc1 -verify=expected,omp50 -fopenmp-simd -fopenmp-version=50 \
7*0a7cc078SDavid Pagan // RUN: -ferror-limit 100 %s -Wuninitialized
8*0a7cc078SDavid Pagan // RUN: %clang_cc1 -verify=expected,omp51 -fopenmp-simd -fopenmp-version=51 \
9*0a7cc078SDavid Pagan // RUN: -ferror-limit 100 %s -Wuninitialized
10c112e941SAlexey Bataev 
11c112e941SAlexey Bataev struct S1 { // expected-note 2 {{declared here}}
12c112e941SAlexey Bataev   int a;
13c112e941SAlexey Bataev } s;
14c112e941SAlexey Bataev 
15c112e941SAlexey Bataev #pragma omp depobj(0) depend(in:s) // expected-error {{unexpected OpenMP directive '#pragma omp depobj'}}
foo()16c112e941SAlexey Bataev void foo() {
17c112e941SAlexey Bataev #pragma omp depobj(0) depend(in:s) // expected-error {{'omp_depend_t' type not found; include <omp.h>}} expected-error {{expected lvalue expression}}}
18c112e941SAlexey Bataev }
19c112e941SAlexey Bataev 
20c112e941SAlexey Bataev typedef void *omp_depend_t;
21c112e941SAlexey Bataev 
22c112e941SAlexey Bataev template <class T>
tmain(T argc)23c112e941SAlexey Bataev T tmain(T argc) {
24c112e941SAlexey Bataev   omp_depend_t x;
25c112e941SAlexey Bataev #pragma omp depobj() allocate(argc) // expected-error {{expected expression}} expected-error {{expected depobj expression}} expected-error {{unexpected OpenMP clause 'allocate' in directive '#pragma omp depobj'}}
26c112e941SAlexey Bataev   ;
27c112e941SAlexey Bataev #pragma omp depobj(x) untied  // expected-error {{unexpected OpenMP clause 'untied' in directive '#pragma omp depobj'}}
28c112e941SAlexey Bataev #pragma omp depobj(x) unknown // expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}}
29c112e941SAlexey Bataev   if (argc)
30375437abSAlexey Bataev #pragma omp depobj(x) destroy // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
31c112e941SAlexey Bataev     if (argc) {
32c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s)
33c112e941SAlexey Bataev     }
34c112e941SAlexey Bataev   while (argc)
3582f7c207SAlexey Bataev #pragma omp depobj(x)update(inout) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
36c112e941SAlexey Bataev     while (argc) {
37c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s)
38c112e941SAlexey Bataev     }
39c112e941SAlexey Bataev   do
40c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
41c112e941SAlexey Bataev     while (argc)
42c112e941SAlexey Bataev       ;
43c112e941SAlexey Bataev   do {
44c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s)
45c112e941SAlexey Bataev   } while (argc);
46c112e941SAlexey Bataev   switch (argc)
47c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
48c112e941SAlexey Bataev     switch (argc)
49c112e941SAlexey Bataev     case 1:
50c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
51c112e941SAlexey Bataev   switch (argc)
52c112e941SAlexey Bataev   case 1: {
53c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s)
54c112e941SAlexey Bataev   }
55c112e941SAlexey Bataev   switch (argc) {
56c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s)
57c112e941SAlexey Bataev   case 1:
58c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s)
59c112e941SAlexey Bataev     break;
60c112e941SAlexey Bataev   default: {
61c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s)
62c112e941SAlexey Bataev   } break;
63c112e941SAlexey Bataev   }
64c112e941SAlexey Bataev   for (;;)
65c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
66c112e941SAlexey Bataev     for (;;) {
67c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s)
68c112e941SAlexey Bataev     }
69c112e941SAlexey Bataev label:
70c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s)
71c112e941SAlexey Bataev label1 : {
72c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s)
73c112e941SAlexey Bataev }
74c112e941SAlexey Bataev 
75c112e941SAlexey Bataev #pragma omp depobj                               // expected-error {{expected depobj expression}}
76c112e941SAlexey Bataev #pragma omp depobj(                              // expected-error {{expected expression}} expected-error {{expected depobj expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
77c112e941SAlexey Bataev #pragma omp depobj()                             // expected-error {{expected expression}} expected-error {{expected depobj expression}}
78c112e941SAlexey Bataev #pragma omp depobj(argc                          // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected lvalue expression of 'omp_depend_t' type, not 'int'}}}
79c112e941SAlexey Bataev #pragma omp depobj(argc,                         // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected lvalue expression of 'omp_depend_t' type, not 'int'}}
80c112e941SAlexey Bataev #pragma omp depobj(argc)                         // expected-error {{expected lvalue expression of 'omp_depend_t' type, not 'int'}}
81c112e941SAlexey Bataev #pragma omp depobj(S1) // expected-error {{'S1' does not refer to a value}} expected-error {{expected depobj expression}}
82c112e941SAlexey Bataev #pragma omp depobj(argc) depobj(argc) // expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}} expected-error {{expected lvalue expression of 'omp_depend_t' type, not 'int'}}}
83c112e941SAlexey Bataev #pragma omp parallel depobj(argc) // expected-warning {{extra tokens at the end of '#pragma omp parallel' are ignored}}
84c112e941SAlexey Bataev   ;
85c112e941SAlexey Bataev   return T();
86c112e941SAlexey Bataev }
87c112e941SAlexey Bataev 
main(int argc,char ** argv)88c112e941SAlexey Bataev int main(int argc, char **argv) {
89c112e941SAlexey Bataev omp_depend_t x;
90c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s)
91c112e941SAlexey Bataev   ;
92c112e941SAlexey Bataev #pragma omp depobj(x) untied  // expected-error {{unexpected OpenMP clause 'untied' in directive '#pragma omp depobj'}}
93c112e941SAlexey Bataev #pragma omp depobj(x) unknown // expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}}
94c112e941SAlexey Bataev   if (argc)
95c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
96c112e941SAlexey Bataev     if (argc) {
97c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s)
98c112e941SAlexey Bataev     }
99c112e941SAlexey Bataev   while (argc)
100c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
101c112e941SAlexey Bataev     while (argc) {
102c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s)
103c112e941SAlexey Bataev     }
104c112e941SAlexey Bataev   do
105c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
106c112e941SAlexey Bataev     while (argc)
107c112e941SAlexey Bataev       ;
108c112e941SAlexey Bataev   do {
109c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s)
110c112e941SAlexey Bataev   } while (argc);
111c112e941SAlexey Bataev   switch (argc)
112c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
113c112e941SAlexey Bataev     switch (argc)
114c112e941SAlexey Bataev     case 1:
115c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
116c112e941SAlexey Bataev   switch (argc)
117c112e941SAlexey Bataev   case 1: {
118c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s)
119c112e941SAlexey Bataev   }
120c112e941SAlexey Bataev   switch (argc) {
121c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s)
122c112e941SAlexey Bataev   case 1:
123c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s)
124c112e941SAlexey Bataev     break;
125c112e941SAlexey Bataev   default: {
126c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s)
127c112e941SAlexey Bataev   } break;
128c112e941SAlexey Bataev   }
129c112e941SAlexey Bataev   for (;;)
130c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
131c112e941SAlexey Bataev     for (;;) {
132c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s)
133c112e941SAlexey Bataev     }
134c112e941SAlexey Bataev label:
135c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s)
136c112e941SAlexey Bataev label1 : {
137c112e941SAlexey Bataev #pragma omp depobj(x) depend(in:s)
138c112e941SAlexey Bataev }
139c112e941SAlexey Bataev 
140c112e941SAlexey Bataev #pragma omp depobj                               // expected-error {{expected depobj expression}}
141c112e941SAlexey Bataev #pragma omp depobj(                              // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected depobj expression}}
142c112e941SAlexey Bataev #pragma omp depobj()                             // expected-error {{expected expression}} expected-error {{expected depobj expression}}
143c112e941SAlexey Bataev #pragma omp depobj(argc                          // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected lvalue expression of 'omp_depend_t' type, not 'int'}}
144c112e941SAlexey Bataev #pragma omp depobj(argc,                         // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected lvalue expression of 'omp_depend_t' type, not 'int'}}
145c112e941SAlexey Bataev #pragma omp depobj(argc)                         // expected-error {{expected lvalue expression of 'omp_depend_t' type, not 'int'}}
146c112e941SAlexey Bataev #pragma omp depobj(S1) // expected-error {{'S1' does not refer to a value}} expected-error {{expected depobj expression}}
147c112e941SAlexey Bataev #pragma omp depobj(argc) depobj(argc) // expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}} expected-error {{expected lvalue expression of 'omp_depend_t' type, not 'int'}}
148c112e941SAlexey Bataev #pragma omp parallel depobj(argc) // expected-warning {{extra tokens at the end of '#pragma omp parallel' are ignored}}
149c112e941SAlexey Bataev   ;
150c112e941SAlexey Bataev #pragma omp depobj(x) seq_cst // expected-error {{unexpected OpenMP clause 'seq_cst' in directive '#pragma omp depobj'}}
151*0a7cc078SDavid Pagan #pragma omp depobj(x) depend(source: x) // omp51-error {{expected depend modifier(iterator) or 'in', 'out', 'inout', 'mutexinoutset' or 'inoutset' in OpenMP clause 'depend'}} omp50-error {{expected depend modifier(iterator) or 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'depend'}}
15282f7c207SAlexey Bataev #pragma omp depobj(x) update // expected-error {{expected '(' after 'update'}}
153*0a7cc078SDavid Pagan #pragma omp depobj(x) update( // expected-error {{expected ')'}} expected-note {{to match this '('}} omp51-error {{expected 'in', 'out', 'inout', 'mutexinoutset' or 'inoutset' in OpenMP clause 'update'}} omp50-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'update'}}
154*0a7cc078SDavid Pagan #pragma omp depobj(x) update(sink // expected-error {{expected ')'}} expected-note {{to match this '('}} omp51-error {{expected 'in', 'out', 'inout', 'mutexinoutset' or 'inoutset' in OpenMP clause 'update'}} omp50-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'update'}}
155375437abSAlexey Bataev #pragma omp depobj(x) destroy destroy // expected-error {{directive '#pragma omp depobj' cannot contain more than one 'destroy' clause}}
15682f7c207SAlexey Bataev #pragma omp depobj(x) update(in) update(in) // expected-error {{directive '#pragma omp depobj' cannot contain more than one 'update' clause}}
1575dadf577SAlexey Bataev #pragma omp depobj(x) depend(in: argc) destroy // expected-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}}
1585dadf577SAlexey Bataev #pragma omp depobj(x) destroy depend(in: argc) // expected-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}}
1595dadf577SAlexey Bataev #pragma omp depobj(x) depend(in: argc) update(mutexinoutset) // expected-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}}
16082f7c207SAlexey Bataev #pragma omp depobj(x) update(inout) destroy // expected-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}}
161c112e941SAlexey Bataev #pragma omp depobj(x) (x) depend(in: x) // expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}}
16282f7c207SAlexey Bataev #pragma omp depobj(x) (x) update(in) // expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}}
1635dadf577SAlexey Bataev #pragma omp depobj(x) depend(in: argc) depend(out:argc) // expected-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}}
164c112e941SAlexey Bataev #pragma omp depend(out:x) depobj(x) // expected-error {{expected an OpenMP directive}}
165375437abSAlexey Bataev #pragma omp destroy depobj(x) // expected-error {{expected an OpenMP directive}}
16682f7c207SAlexey Bataev #pragma omp update(out) depobj(x) // expected-error {{expected an OpenMP directive}}
1677ac9efb0SAlexey Bataev #pragma omp depobj depend(in:x) (x) // expected-error {{expected depobj expression}} expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}} expected-error {{expected addressable lvalue expression, array element, array section or array shaping expression of non 'omp_depend_t' type}}
168375437abSAlexey Bataev #pragma omp depobj destroy (x) // expected-error {{expected depobj expression}} expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}}
16982f7c207SAlexey Bataev #pragma omp depobj update(in) (x) // expected-error {{expected depobj expression}} expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}}
170c112e941SAlexey Bataev   return tmain(argc); // expected-note {{in instantiation of function template specialization 'tmain<int>' requested here}}
171c112e941SAlexey Bataev }
172