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