xref: /llvm-project/clang/test/OpenMP/depobj_messages.cpp (revision 978e0839ae2feb5ddda3e4e0b5a7ddba1727d2d8)
1 // RUN: %clang_cc1 -verify=expected,omp50 -fopenmp -fopenmp-version=50 \
2 // RUN: -ferror-limit 100 %s -Wuninitialized
3 // RUN: %clang_cc1 -verify=expected,omp51 -fopenmp \
4 // RUN: -ferror-limit 100 %s -Wuninitialized
5 // RUN: %clang_cc1 -verify=expected,omp52 -fopenmp -fopenmp-version=52 \
6 // RUN: -ferror-limit 100 %s -Wuninitialized
7 // RUN: %clang_cc1 -verify=expected,omp52 -fopenmp -fopenmp-version=60 \
8 // RUN: -ferror-limit 100 %s -Wuninitialized
9 
10 // RUN: %clang_cc1 -verify=expected,omp50 -fopenmp-simd -fopenmp-version=50 \
11 // RUN: -ferror-limit 100 %s -Wuninitialized
12 // RUN: %clang_cc1 -verify=expected,omp51 -fopenmp-simd \
13 // RUN: -ferror-limit 100 %s -Wuninitialized
14 // RUN: %clang_cc1 -verify=expected,omp52 -fopenmp-simd -fopenmp-version=52 \
15 // RUN: -ferror-limit 100 %s -Wuninitialized
16 // RUN: %clang_cc1 -verify=expected,omp52 -fopenmp-simd -fopenmp-version=60 \
17 // RUN: -ferror-limit 100 %s -Wuninitialized
18 
19 struct S1 { // expected-note 2 {{declared here}}
20   int a;
21 } s;
22 
23 #pragma omp depobj(0) depend(in:s) // expected-error {{unexpected OpenMP directive '#pragma omp depobj'}}
24 void foo() {
25 #pragma omp depobj(0) depend(in:s) // expected-error {{'omp_depend_t' type not found; include <omp.h>}} expected-error {{expected lvalue expression}}}
26 }
27 
28 typedef void *omp_depend_t;
29 
30 template <class T>
31 T tmain(T argc) {
32   omp_depend_t x;
33 #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'}}
34   ;
35 #pragma omp depobj(x) untied  // expected-error {{unexpected OpenMP clause 'untied' in directive '#pragma omp depobj'}}
36 #pragma omp depobj(x) unknown // expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}}
37   if (argc)
38 #pragma omp depobj(x) destroy // omp52-error {{expected 'destroy' clause with an argument on '#pragma omp depobj' construct}} expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
39     if (argc) {
40 #pragma omp depobj(x) depend(in:s)
41     }
42   while (argc)
43 #pragma omp depobj(x)update(inout) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
44     while (argc) {
45 #pragma omp depobj(x) depend(in:s)
46     }
47   do
48 #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
49     while (argc)
50       ;
51   do {
52 #pragma omp depobj(x) depend(in:s)
53   } while (argc);
54   switch (argc)
55 #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
56     switch (argc)
57     case 1:
58 #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
59   switch (argc)
60   case 1: {
61 #pragma omp depobj(x) depend(in:s)
62   }
63   switch (argc) {
64 #pragma omp depobj(x) depend(in:s)
65   case 1:
66 #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
67     break;
68   default: {
69 #pragma omp depobj(x) depend(in:s)
70   } break;
71   }
72   for (;;)
73 #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
74     for (;;) {
75 #pragma omp depobj(x) depend(in:s)
76     }
77 label:
78 #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
79 label1 : {
80 #pragma omp depobj(x) depend(in:s)
81 }
82 
83 #pragma omp depobj                               // expected-error {{expected depobj expression}}
84 #pragma omp depobj(                              // expected-error {{expected expression}} expected-error {{expected depobj expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
85 #pragma omp depobj()                             // expected-error {{expected expression}} expected-error {{expected depobj expression}}
86 #pragma omp depobj(argc                          // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected lvalue expression of 'omp_depend_t' type, not 'int'}}}
87 #pragma omp depobj(argc,                         // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected lvalue expression of 'omp_depend_t' type, not 'int'}}
88 #pragma omp depobj(argc)                         // expected-error {{expected lvalue expression of 'omp_depend_t' type, not 'int'}}
89 #pragma omp depobj(S1) // expected-error {{'S1' does not refer to a value}} expected-error {{expected depobj expression}}
90 #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'}}}
91 #pragma omp parallel depobj(argc) // expected-warning {{extra tokens at the end of '#pragma omp parallel' are ignored}}
92   ;
93   return T();
94 }
95 
96 int main(int argc, char **argv) {
97 omp_depend_t x;
98 #pragma omp depobj(x) depend(in:s)
99   ;
100 #pragma omp depobj(x) untied  // expected-error {{unexpected OpenMP clause 'untied' in directive '#pragma omp depobj'}}
101 #pragma omp depobj(x) unknown // expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}}
102   if (argc)
103 #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
104     if (argc) {
105 #pragma omp depobj(x) depend(in:s)
106     }
107   while (argc)
108 #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
109     while (argc) {
110 #pragma omp depobj(x) depend(in:s)
111     }
112   do
113 #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
114     while (argc)
115       ;
116   do {
117 #pragma omp depobj(x) depend(in:s)
118   } while (argc);
119   switch (argc)
120 #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
121     switch (argc)
122     case 1:
123 #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
124   switch (argc)
125   case 1: {
126 #pragma omp depobj(x) depend(in:s)
127   }
128   switch (argc) {
129 #pragma omp depobj(x) depend(in:s)
130   case 1:
131 #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
132     break;
133   default: {
134 #pragma omp depobj(x) depend(in:s)
135   } break;
136   }
137   for (;;)
138 #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
139     for (;;) {
140 #pragma omp depobj(x) depend(in:s)
141     }
142 label:
143 #pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
144 label1 : {
145 #pragma omp depobj(x) depend(in:s)
146 }
147 
148 #pragma omp depobj                               // expected-error {{expected depobj expression}}
149 #pragma omp depobj(                              // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected depobj expression}}
150 #pragma omp depobj()                             // expected-error {{expected expression}} expected-error {{expected depobj expression}}
151 #pragma omp depobj(argc                          // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected lvalue expression of 'omp_depend_t' type, not 'int'}}
152 #pragma omp depobj(argc,                         // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected lvalue expression of 'omp_depend_t' type, not 'int'}}
153 #pragma omp depobj(argc)                         // expected-error {{expected lvalue expression of 'omp_depend_t' type, not 'int'}}
154 #pragma omp depobj(S1) // expected-error {{'S1' does not refer to a value}} expected-error {{expected depobj expression}}
155 #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'}}
156 #pragma omp parallel depobj(argc) // expected-warning {{extra tokens at the end of '#pragma omp parallel' are ignored}}
157   ;
158 #pragma omp depobj(x) seq_cst // expected-error {{unexpected OpenMP clause 'seq_cst' in directive '#pragma omp depobj'}}
159 #pragma omp depobj(x) depend(source: x) // omp52-error {{expected depend modifier(iterator) or 'in', 'out', 'inout', 'mutexinoutset' or 'inoutset' in OpenMP clause 'depend'}} 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'}}
160 #pragma omp depobj(x) update // expected-error {{expected '(' after 'update'}}
161 #pragma omp depobj(x) update( // expected-error {{expected ')'}} expected-note {{to match this '('}} omp52-error {{expected 'in', 'out', 'inout', 'mutexinoutset' or 'inoutset' in OpenMP clause 'update'}} 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'}}
162 #pragma omp depobj(x) update(sink // expected-error {{expected ')'}} expected-note {{to match this '('}} omp52-error {{expected 'in', 'out', 'inout', 'mutexinoutset' or 'inoutset' in OpenMP clause 'update'}} 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'}}
163 #pragma omp depobj(x) destroy destroy //omp52-error {{expected 'destroy' clause with an argument on '#pragma omp depobj' construct}} omp50-error {{directive '#pragma omp depobj' cannot contain more than one 'destroy' clause}} // omp52-error {{directive '#pragma omp depobj' cannot contain more than one 'destroy' clause}} omp52-error {{expected 'destroy' clause with an argument on '#pragma omp depobj' construct}} omp51-error {{directive '#pragma omp depobj' cannot contain more than one 'destroy' clause}}
164 #pragma omp depobj(x) update(in) update(in) // expected-error {{directive '#pragma omp depobj' cannot contain more than one 'update' clause}}
165 #pragma omp depobj(x) depend(in: argc) destroy // omp52-error {{expected 'destroy' clause with an argument on '#pragma omp depobj' construct}} omp51-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}} omp50-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}}
166 #pragma omp depobj(x) destroy depend(in: argc) // omp52-error {{expected 'destroy' clause with an argument on '#pragma omp depobj' construct}} omp51-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}} omp50-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}}
167 #pragma omp depobj(x) depend(in: argc) update(mutexinoutset) // expected-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}}
168 #pragma omp depobj(x) update(inout) destroy // omp52-error {{expected 'destroy' clause with an argument on '#pragma omp depobj' construct}} omp51-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}} omp50-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}}
169 #pragma omp depobj(x) (x) depend(in: x) // expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}}
170 #pragma omp depobj(x) (x) update(in) // expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}}
171 #pragma omp depobj(x) depend(in: argc) depend(out:argc) // expected-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}}
172 #pragma omp depend(out:x) depobj(x) // expected-error {{expected an OpenMP directive}}
173 #pragma omp destroy depobj(x) // expected-error {{expected an OpenMP directive}}
174 #pragma omp update(out) depobj(x) // expected-error {{expected an OpenMP directive}}
175 #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}}
176 #pragma omp depobj destroy (x) // omp52-error {{expected 'destroy' clause with an argument on '#pragma omp depobj' construct}} expected-error {{expected depobj expression}} expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}}
177 #pragma omp depobj update(in) (x) // expected-error {{expected depobj expression}} expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}}
178   return tmain(argc); // expected-note {{in instantiation of function template specialization 'tmain<int>' requested here}}
179 }
180