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