xref: /llvm-project/clang/test/OpenMP/interop_messages.cpp (revision dd4c838da30ad4b6d5dc0f700df0a6629469f719)
1 // RUN: %clang_cc1 -verify -fopenmp -std=c++11 -o - -DWITHDEF %s
2 // RUN: %clang_cc1 -verify -fopenmp -std=c++11 -o - -DWITHOUTDEF %s
3 // RUN: %clang_cc1 -verify -fopenmp -std=c99 -x c -o - -DCTEST %s
4 
5 #ifdef WITHDEF
6 typedef void *omp_interop_t;
7 
foo(int * Ap)8 void foo(int *Ap) {
9   omp_interop_t InteropVar;
10   omp_interop_t Another;
11 
12   //expected-error@+1 {{expected interop type: 'target' and/or 'targetsync'}}
13   #pragma omp interop init(target,foo:InteropVar) init(target:Another)
14 
15   //expected-error@+1 {{use of undeclared identifier 'NoDeclVar'}}
16   #pragma omp interop init(target:NoDeclVar) init(target:Another)
17 
18   //expected-error@+1 {{use of undeclared identifier 'NoDeclVar'}}
19   #pragma omp interop use(NoDeclVar) use(Another)
20 
21   //expected-error@+1 {{use of undeclared identifier 'NoDeclVar'}}
22   #pragma omp interop destroy(NoDeclVar) destroy(Another)
23 
24   //expected-error@+2 {{expected interop type: 'target' and/or 'targetsync'}}
25   //expected-error@+1 {{expected expression}}
26   #pragma omp interop init(InteropVar) init(target:Another)
27 
28   //expected-warning@+1 {{missing ':' after interop types}}
29   #pragma omp interop init(target InteropVar)
30 
31   //expected-error@+1 {{expected expression}}
32   #pragma omp interop init(prefer_type(1,+,3),target:InteropVar) \
33                       init(target:Another)
34 
35   int IntVar;
36   struct S { int I; } SVar;
37 
38   //expected-error@+1 {{interop variable must be of type 'omp_interop_t'}}
39   #pragma omp interop init(prefer_type(1,"sycl",3),target:IntVar) \
40                       init(target:Another)
41 
42   //expected-error@+1 {{interop variable must be of type 'omp_interop_t'}}
43   #pragma omp interop use(IntVar) use(Another)
44 
45   //expected-error@+1 {{interop variable must be of type 'omp_interop_t'}}
46   #pragma omp interop destroy(IntVar) destroy(Another)
47 
48   //expected-error@+1 {{interop variable must be of type 'omp_interop_t'}}
49   #pragma omp interop init(prefer_type(1,"sycl",3),target:SVar) \
50                       init(target:Another)
51 
52   //expected-error@+1 {{interop variable must be of type 'omp_interop_t'}}
53   #pragma omp interop use(SVar) use(Another)
54 
55   //expected-error@+1 {{interop variable must be of type 'omp_interop_t'}}
56   #pragma omp interop destroy(SVar) destroy(Another)
57 
58   int a, b;
59   //expected-error@+1 {{expected variable or static data member of type 'omp_interop_t'}}
60   #pragma omp interop init(target:a+b) init(target:Another)
61 
62   //expected-error@+1 {{expected variable or static data member of type 'omp_interop_t'}}
63   #pragma omp interop use(a+b) use(Another)
64 
65   //expected-error@+1 {{expected variable or static data member of type 'omp_interop_t'}}
66   #pragma omp interop destroy(a+b) destroy(Another)
67 
68   const omp_interop_t C = (omp_interop_t)5;
69   //expected-error@+1 {{expected non-const variable of type 'omp_interop_t'}}
70   #pragma omp interop init(target:C) init(target:Another)
71 
72   //expected-error@+1 {{expected non-const variable of type 'omp_interop_t'}}
73   #pragma omp interop destroy(C) destroy(Another)
74 
75   //expected-error@+1 {{prefer_list item must be a string literal or constant integral expression}}
76   #pragma omp interop init(prefer_type(1.0),target:InteropVar) \
77                       init(target:Another)
78 
79   //expected-error@+1 {{prefer_list item must be a string literal or constant integral expression}}
80   #pragma omp interop init(prefer_type(a),target:InteropVar) \
81                       init(target:Another)
82 
83   //expected-error@+1 {{expected at least one 'init', 'use', 'destroy', or 'nowait' clause for '#pragma omp interop'}}
84   #pragma omp interop device(0)
85 
86   //expected-warning@+1 {{interop type 'target' cannot be specified more than once}}
87   #pragma omp interop init(target,targetsync,target:InteropVar)
88 
89   //expected-error@+1 {{'depend' clause requires the 'targetsync' interop type}}
90   #pragma omp interop init(target:InteropVar) depend(inout:Ap)
91 
92   //expected-error@+1 {{interop variable 'InteropVar' used in multiple action clauses}}
93   #pragma omp interop init(target:InteropVar) init(target:InteropVar)
94 
95   //expected-error@+1 {{interop variable 'InteropVar' used in multiple action clauses}}
96   #pragma omp interop use(InteropVar) use(InteropVar)
97 
98   //expected-error@+1 {{interop variable 'InteropVar' used in multiple action clauses}}
99   #pragma omp interop destroy(InteropVar) destroy(InteropVar)
100 
101   //expected-error@+1 {{interop variable 'InteropVar' used in multiple action clauses}}
102   #pragma omp interop init(target:InteropVar) use(InteropVar)
103 
104   //expected-error@+1 {{interop variable 'InteropVar' used in multiple action clauses}}
105   #pragma omp interop init(target:InteropVar) destroy(InteropVar)
106 
107   //expected-error@+1 {{interop variable 'InteropVar' used in multiple action clauses}}
108   #pragma omp interop use(InteropVar) destroy(InteropVar)
109 
110   //expected-error@+1 {{directive '#pragma omp interop' cannot contain more than one 'device' clause}}
111   #pragma omp interop init(target:InteropVar) device(0) device(1)
112 
113   //expected-error@+1 {{argument to 'device' clause must be a non-negative integer value}}
114   #pragma omp interop init(target:InteropVar) device(-4)
115 
116   //expected-error@+1 {{directive '#pragma omp interop' cannot contain more than one 'nowait' clause}}
117   #pragma omp interop nowait init(target:InteropVar) nowait
118 }
119 
120 struct S {
121   void foo();
122   omp_interop_t InteropVar;
123   omp_interop_t func();
124   static omp_interop_t sfunc();
125 };
126 
127 struct T {
128   static void static_member_func();
129 };
130 
static_member_func()131 void T::static_member_func() {
132   S s;
133   omp_interop_t o;
134 
135   //expected-error@+1 {{expected variable or static data member of type 'omp_interop_t'}}
136   #pragma omp interop init(target:s.InteropVar) init(target:o)
137 }
138 
foo()139 void S::foo() {
140   //expected-error@+1 {{interop variable 'InteropVar' used in multiple action clauses}}
141   #pragma omp interop init(target:InteropVar) init(target:InteropVar)
142 
143   //expected-error@+1 {{interop variable 'InteropVar' used in multiple action clauses}}
144   #pragma omp interop use(InteropVar) use(InteropVar)
145 
146   //expected-error@+1 {{interop variable 'InteropVar' used in multiple action clauses}}
147   #pragma omp interop destroy(InteropVar) destroy(InteropVar)
148 
149   //expected-error@+1 {{interop variable 'InteropVar' used in multiple action clauses}}
150   #pragma omp interop init(target:InteropVar) use(InteropVar)
151 
152   //expected-error@+1 {{interop variable 'InteropVar' used in multiple action clauses}}
153   #pragma omp interop init(target:InteropVar) destroy(InteropVar)
154 
155   //expected-error@+1 {{interop variable 'InteropVar' used in multiple action clauses}}
156   #pragma omp interop use(InteropVar) destroy(InteropVar)
157 
158   //expected-error@+1 {{expected variable, static data member, or non-static data member of current class of type 'omp_interop_t'}}
159   #pragma omp interop init(target:InteropVar) init(target:func())
160 
161   //expected-error@+1 {{expected variable, static data member, or non-static data member of current class of type 'omp_interop_t'}}
162   #pragma omp interop init(target:InteropVar) init(target:sfunc())
163 }
164 
foo2()165 void foo2() {
166   S s;
167   omp_interop_t another;
168   //expected-error@+1 {{expected variable or static data member of type 'omp_interop_t'}}
169   #pragma omp interop init(target:s.InteropVar) init(target:another)
170 
171   //expected-error@+1 {{expected variable or static data member of type 'omp_interop_t'}}
172   #pragma omp interop init(target: S::sfunc()) init(target:another)
173 }
174 #endif
175 #ifdef WITHOUTDEF
foo()176 void foo() {
177   int InteropVar;
178   //expected-error@+1 {{'omp_interop_t' type not found; include <omp.h>}}
179   #pragma omp interop init(prefer_type(1,"sycl",3),target:InteropVar) nowait
180   //expected-error@+1 {{'omp_interop_t' type not found; include <omp.h>}}
181   #pragma omp interop use(InteropVar) nowait
182   //expected-error@+1 {{'omp_interop_t' type not found; include <omp.h>}}
183   #pragma omp interop destroy(InteropVar) nowait
184 }
185 #endif
186 #ifdef CTEST
187 typedef void *omp_interop_t;
188 omp_interop_t bar();
189 struct S {
190   omp_interop_t o;
191 };
foo()192 void foo() {
193   omp_interop_t o;
194   struct S s;
195 
196   //expected-error@+1 {{expected variable of type 'omp_interop_t'}}
197   #pragma omp interop init(target:o) init(target:bar())
198 
199   //expected-error@+1 {{expected variable of type 'omp_interop_t'}}
200   #pragma omp interop init(target:o) init(target:s.o)
201 }
202 #endif
203