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
4 #ifdef WITHDEF
5 typedef void *omp_interop_t;
6
foo(int * Ap)7 void foo(int *Ap) {
8 omp_interop_t InteropVar;
9 omp_interop_t Another;
10
11 //expected-error@+1 {{expected interop type: 'target' and/or 'targetsync'}}
12 #pragma omp interop init(target,foo:InteropVar) init(target:Another)
13
14 //expected-error@+1 {{use of undeclared identifier 'NoDeclVar'}}
15 #pragma omp interop init(target:NoDeclVar) init(target:Another)
16
17 //expected-error@+1 {{use of undeclared identifier 'NoDeclVar'}}
18 #pragma omp interop use(NoDeclVar) use(Another)
19
20 //expected-error@+1 {{use of undeclared identifier 'NoDeclVar'}}
21 #pragma omp interop destroy(NoDeclVar) destroy(Another)
22
23 //expected-error@+2 {{expected interop type: 'target' and/or 'targetsync'}}
24 //expected-error@+1 {{expected expression}}
25 #pragma omp interop init(InteropVar) init(target:Another)
26
27 //expected-warning@+1 {{missing ':' after interop types}}
28 #pragma omp interop init(target InteropVar)
29
30 //expected-error@+1 {{expected expression}}
31 #pragma omp interop init(prefer_type(1,+,3),target:InteropVar) \
32 init(target:Another)
33
34 int IntVar;
35 struct S { int I; } SVar;
36
37 //expected-error@+1 {{interop variable must be of type 'omp_interop_t'}}
38 #pragma omp interop init(prefer_type(1,"sycl",3),target:IntVar) \
39 init(target:Another)
40
41 //expected-error@+1 {{interop variable must be of type 'omp_interop_t'}}
42 #pragma omp interop use(IntVar) use(Another)
43
44 //expected-error@+1 {{interop variable must be of type 'omp_interop_t'}}
45 #pragma omp interop destroy(IntVar) destroy(Another)
46
47 //expected-error@+1 {{interop variable must be of type 'omp_interop_t'}}
48 #pragma omp interop init(prefer_type(1,"sycl",3),target:SVar) \
49 init(target:Another)
50
51 //expected-error@+1 {{interop variable must be of type 'omp_interop_t'}}
52 #pragma omp interop use(SVar) use(Another)
53
54 //expected-error@+1 {{interop variable must be of type 'omp_interop_t'}}
55 #pragma omp interop destroy(SVar) destroy(Another)
56
57 int a, b;
58 //expected-error@+1 {{expected variable of type 'omp_interop_t'}}
59 #pragma omp interop init(target:a+b) init(target:Another)
60
61 //expected-error@+1 {{expected variable of type 'omp_interop_t'}}
62 #pragma omp interop use(a+b) use(Another)
63
64 //expected-error@+1 {{expected variable of type 'omp_interop_t'}}
65 #pragma omp interop destroy(a+b) destroy(Another)
66
67 const omp_interop_t C = (omp_interop_t)5;
68 //expected-error@+1 {{expected non-const variable of type 'omp_interop_t'}}
69 #pragma omp interop init(target:C) init(target:Another)
70
71 //expected-error@+1 {{expected non-const variable of type 'omp_interop_t'}}
72 #pragma omp interop destroy(C) destroy(Another)
73
74 //expected-error@+1 {{prefer_list item must be a string literal or constant integral expression}}
75 #pragma omp interop init(prefer_type(1.0),target:InteropVar) \
76 init(target:Another)
77
78 //expected-error@+1 {{prefer_list item must be a string literal or constant integral expression}}
79 #pragma omp interop init(prefer_type(a),target:InteropVar) \
80 init(target:Another)
81
82 //expected-error@+1 {{expected at least one 'init', 'use', 'destroy', or 'nowait' clause for '#pragma omp interop'}}
83 #pragma omp interop device(0)
84
85 //expected-warning@+1 {{interop type 'target' cannot be specified more than once}}
86 #pragma omp interop init(target,targetsync,target:InteropVar)
87
88 //expected-error@+1 {{'depend' clause requires the 'targetsync' interop type}}
89 #pragma omp interop init(target:InteropVar) depend(inout:Ap)
90
91 //expected-error@+1 {{interop variable 'InteropVar' used in multiple action clauses}}
92 #pragma omp interop init(target:InteropVar) init(target:InteropVar)
93
94 //expected-error@+1 {{interop variable 'InteropVar' used in multiple action clauses}}
95 #pragma omp interop use(InteropVar) use(InteropVar)
96
97 //expected-error@+1 {{interop variable 'InteropVar' used in multiple action clauses}}
98 #pragma omp interop destroy(InteropVar) destroy(InteropVar)
99
100 //expected-error@+1 {{interop variable 'InteropVar' used in multiple action clauses}}
101 #pragma omp interop init(target:InteropVar) use(InteropVar)
102
103 //expected-error@+1 {{interop variable 'InteropVar' used in multiple action clauses}}
104 #pragma omp interop init(target:InteropVar) destroy(InteropVar)
105
106 //expected-error@+1 {{interop variable 'InteropVar' used in multiple action clauses}}
107 #pragma omp interop use(InteropVar) destroy(InteropVar)
108
109 //expected-error@+1 {{directive '#pragma omp interop' cannot contain more than one 'device' clause}}
110 #pragma omp interop init(target:InteropVar) device(0) device(1)
111
112 //expected-error@+1 {{argument to 'device' clause must be a non-negative integer value}}
113 #pragma omp interop init(target:InteropVar) device(-4)
114
115 //expected-error@+1 {{directive '#pragma omp interop' cannot contain more than one 'nowait' clause}}
116 #pragma omp interop nowait init(target:InteropVar) nowait
117 }
118 #endif
119 #ifdef WITHOUTDEF
foo()120 void foo() {
121 int InteropVar;
122 //expected-error@+1 {{'omp_interop_t' type not found; include <omp.h>}}
123 #pragma omp interop init(prefer_type(1,"sycl",3),target:InteropVar) nowait
124 //expected-error@+1 {{'omp_interop_t' type not found; include <omp.h>}}
125 #pragma omp interop use(InteropVar) nowait
126 //expected-error@+1 {{'omp_interop_t' type not found; include <omp.h>}}
127 #pragma omp interop destroy(InteropVar) nowait
128 }
129 #endif
130