blob: ad28dffe184a84884e039036cd96a88d8a4c1f82 [file] [log] [blame]
Alexey Bataevc112e942020-02-28 09:52:15 -05001// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -ferror-limit 100 %s -Wuninitialized
2
3// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=50 -ferror-limit 100 %s -Wuninitialized
4
5struct S1 { // expected-note 2 {{declared here}}
6 int a;
7} s;
8
9#pragma omp depobj(0) depend(in:s) // expected-error {{unexpected OpenMP directive '#pragma omp depobj'}}
10void foo() {
11#pragma omp depobj(0) depend(in:s) // expected-error {{'omp_depend_t' type not found; include <omp.h>}} expected-error {{expected lvalue expression}}}
12}
13
14typedef void *omp_depend_t;
15
16template <class T>
17T tmain(T argc) {
18 omp_depend_t x;
19#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'}}
20 ;
21#pragma omp depobj(x) untied // expected-error {{unexpected OpenMP clause 'untied' in directive '#pragma omp depobj'}}
22#pragma omp depobj(x) unknown // expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}}
23 if (argc)
Alexey Bataev375437a2020-03-02 14:21:20 -050024#pragma omp depobj(x) destroy // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
Alexey Bataevc112e942020-02-28 09:52:15 -050025 if (argc) {
26#pragma omp depobj(x) depend(in:s)
27 }
28 while (argc)
Alexey Bataev82f7c202020-03-03 13:22:35 -050029#pragma omp depobj(x)update(inout) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
Alexey Bataevc112e942020-02-28 09:52:15 -050030 while (argc) {
31#pragma omp depobj(x) depend(in:s)
32 }
33 do
34#pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
35 while (argc)
36 ;
37 do {
38#pragma omp depobj(x) depend(in:s)
39 } while (argc);
40 switch (argc)
41#pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
42 switch (argc)
43 case 1:
44#pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
45 switch (argc)
46 case 1: {
47#pragma omp depobj(x) depend(in:s)
48 }
49 switch (argc) {
50#pragma omp depobj(x) depend(in:s)
51 case 1:
52#pragma omp depobj(x) depend(in:s)
53 break;
54 default: {
55#pragma omp depobj(x) depend(in:s)
56 } break;
57 }
58 for (;;)
59#pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
60 for (;;) {
61#pragma omp depobj(x) depend(in:s)
62 }
63label:
64#pragma omp depobj(x) depend(in:s)
65label1 : {
66#pragma omp depobj(x) depend(in:s)
67}
68
69#pragma omp depobj // expected-error {{expected depobj expression}}
70#pragma omp depobj( // expected-error {{expected expression}} expected-error {{expected depobj expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
71#pragma omp depobj() // expected-error {{expected expression}} expected-error {{expected depobj expression}}
72#pragma omp depobj(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected lvalue expression of 'omp_depend_t' type, not 'int'}}}
73#pragma omp depobj(argc, // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected lvalue expression of 'omp_depend_t' type, not 'int'}}
74#pragma omp depobj(argc) // expected-error {{expected lvalue expression of 'omp_depend_t' type, not 'int'}}
75#pragma omp depobj(S1) // expected-error {{'S1' does not refer to a value}} expected-error {{expected depobj expression}}
76#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'}}}
77#pragma omp parallel depobj(argc) // expected-warning {{extra tokens at the end of '#pragma omp parallel' are ignored}}
78 ;
79 return T();
80}
81
82int main(int argc, char **argv) {
83omp_depend_t x;
84#pragma omp depobj(x) depend(in:s)
85 ;
86#pragma omp depobj(x) untied // expected-error {{unexpected OpenMP clause 'untied' in directive '#pragma omp depobj'}}
87#pragma omp depobj(x) unknown // expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}}
88 if (argc)
89#pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
90 if (argc) {
91#pragma omp depobj(x) depend(in:s)
92 }
93 while (argc)
94#pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
95 while (argc) {
96#pragma omp depobj(x) depend(in:s)
97 }
98 do
99#pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
100 while (argc)
101 ;
102 do {
103#pragma omp depobj(x) depend(in:s)
104 } while (argc);
105 switch (argc)
106#pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
107 switch (argc)
108 case 1:
109#pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
110 switch (argc)
111 case 1: {
112#pragma omp depobj(x) depend(in:s)
113 }
114 switch (argc) {
115#pragma omp depobj(x) depend(in:s)
116 case 1:
117#pragma omp depobj(x) depend(in:s)
118 break;
119 default: {
120#pragma omp depobj(x) depend(in:s)
121 } break;
122 }
123 for (;;)
124#pragma omp depobj(x) depend(in:s) // expected-error {{'#pragma omp depobj' cannot be an immediate substatement}}
125 for (;;) {
126#pragma omp depobj(x) depend(in:s)
127 }
128label:
129#pragma omp depobj(x) depend(in:s)
130label1 : {
131#pragma omp depobj(x) depend(in:s)
132}
133
134#pragma omp depobj // expected-error {{expected depobj expression}}
135#pragma omp depobj( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected depobj expression}}
136#pragma omp depobj() // expected-error {{expected expression}} expected-error {{expected depobj expression}}
137#pragma omp depobj(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected lvalue expression of 'omp_depend_t' type, not 'int'}}
138#pragma omp depobj(argc, // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected lvalue expression of 'omp_depend_t' type, not 'int'}}
139#pragma omp depobj(argc) // expected-error {{expected lvalue expression of 'omp_depend_t' type, not 'int'}}
140#pragma omp depobj(S1) // expected-error {{'S1' does not refer to a value}} expected-error {{expected depobj expression}}
141#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'}}
142#pragma omp parallel depobj(argc) // expected-warning {{extra tokens at the end of '#pragma omp parallel' are ignored}}
143 ;
144#pragma omp depobj(x) seq_cst // expected-error {{unexpected OpenMP clause 'seq_cst' in directive '#pragma omp depobj'}}
Alexey Bataev4f29d302020-03-04 09:29:50 -0500145#pragma omp depobj(x) depend(source: x) // expected-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'depend'}}
Alexey Bataev82f7c202020-03-03 13:22:35 -0500146#pragma omp depobj(x) update // expected-error {{expected '(' after 'update'}}
147#pragma omp depobj(x) update( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'update'}}
Alexey Bataev4f29d302020-03-04 09:29:50 -0500148#pragma omp depobj(x) update(sink // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'update'}}
Alexey Bataev375437a2020-03-02 14:21:20 -0500149#pragma omp depobj(x) destroy destroy // expected-error {{directive '#pragma omp depobj' cannot contain more than one 'destroy' clause}}
Alexey Bataev82f7c202020-03-03 13:22:35 -0500150#pragma omp depobj(x) update(in) update(in) // expected-error {{directive '#pragma omp depobj' cannot contain more than one 'update' clause}}
Alexey Bataev5dadf572020-03-06 11:09:55 -0500151#pragma omp depobj(x) depend(in: argc) destroy // expected-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}}
152#pragma omp depobj(x) destroy depend(in: argc) // expected-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}}
153#pragma omp depobj(x) depend(in: argc) update(mutexinoutset) // expected-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}}
Alexey Bataev82f7c202020-03-03 13:22:35 -0500154#pragma omp depobj(x) update(inout) destroy // expected-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}}
Alexey Bataevc112e942020-02-28 09:52:15 -0500155#pragma omp depobj(x) (x) depend(in: x) // expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}}
Alexey Bataev82f7c202020-03-03 13:22:35 -0500156#pragma omp depobj(x) (x) update(in) // expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}}
Alexey Bataev5dadf572020-03-06 11:09:55 -0500157#pragma omp depobj(x) depend(in: argc) depend(out:argc) // expected-error {{exactly one of 'depend', 'destroy', or 'update' clauses is expected}}
Alexey Bataevc112e942020-02-28 09:52:15 -0500158#pragma omp depend(out:x) depobj(x) // expected-error {{expected an OpenMP directive}}
Alexey Bataev375437a2020-03-02 14:21:20 -0500159#pragma omp destroy depobj(x) // expected-error {{expected an OpenMP directive}}
Alexey Bataev82f7c202020-03-03 13:22:35 -0500160#pragma omp update(out) depobj(x) // expected-error {{expected an OpenMP directive}}
Alexey Bataev5dadf572020-03-06 11:09:55 -0500161#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 or array section of non 'omp_depend_t' type}}
Alexey Bataev375437a2020-03-02 14:21:20 -0500162#pragma omp depobj destroy (x) // expected-error {{expected depobj expression}} expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}}
Alexey Bataev82f7c202020-03-03 13:22:35 -0500163#pragma omp depobj update(in) (x) // expected-error {{expected depobj expression}} expected-warning {{extra tokens at the end of '#pragma omp depobj' are ignored}}
Alexey Bataevc112e942020-02-28 09:52:15 -0500164 return tmain(argc); // expected-note {{in instantiation of function template specialization 'tmain<int>' requested here}}
165}