1b7899ba0SMike Rice // RUN: %clang_cc1 -triple=x86_64-pc-win32 -verify -fopenmp \
2b7899ba0SMike Rice // RUN: -x c++ -std=c++14 -fexceptions -fcxx-exceptions %s
3b7899ba0SMike Rice
4b7899ba0SMike Rice // RUN: %clang_cc1 -triple=x86_64-pc-linux-gnu -verify -fopenmp \
5b7899ba0SMike Rice // RUN: -x c++ -std=c++14 -fexceptions -fcxx-exceptions %s
6b7899ba0SMike Rice
7b7899ba0SMike Rice int disp_variant();
8b7899ba0SMike Rice #pragma omp declare variant(disp_variant) \
9b7899ba0SMike Rice match(construct = {dispatch}, device = {arch(arm)})
10b7899ba0SMike Rice int disp_call();
11b7899ba0SMike Rice
12b7899ba0SMike Rice struct Obj {
13b7899ba0SMike Rice int disp_method_variant1();
14b7899ba0SMike Rice #pragma omp declare variant(disp_method_variant1) \
15b7899ba0SMike Rice match(construct={dispatch}, device={arch(arm)})
16b7899ba0SMike Rice int disp_method1();
17b7899ba0SMike Rice int disp_method_variant2();
18b7899ba0SMike Rice #pragma omp declare variant(disp_method_variant2) \
19b7899ba0SMike Rice match(construct={dispatch}, device={arch(arm)})
20b7899ba0SMike Rice int disp_method2();
21b7899ba0SMike Rice };
22b7899ba0SMike Rice
testit_one(int dnum)23b7899ba0SMike Rice void testit_one(int dnum) {
24b7899ba0SMike Rice // expected-error@+1 {{cannot contain more than one 'device' clause}}
25b7899ba0SMike Rice #pragma omp dispatch device(dnum) device(3)
26b7899ba0SMike Rice disp_call();
27b7899ba0SMike Rice
28b7899ba0SMike Rice // expected-error@+1 {{cannot contain more than one 'nowait' clause}}
29b7899ba0SMike Rice #pragma omp dispatch nowait device(dnum) nowait
30b7899ba0SMike Rice disp_call();
31cb424feeSJennifer Yu
32cb424feeSJennifer Yu // expected-error@+1 {{expected '(' after 'novariants'}}
33cb424feeSJennifer Yu #pragma omp dispatch novariants
34cb424feeSJennifer Yu disp_call();
35cb424feeSJennifer Yu
36cb424feeSJennifer Yu // expected-error@+3 {{expected expression}}
37cb424feeSJennifer Yu // expected-error@+2 {{expected ')'}}
38cb424feeSJennifer Yu // expected-note@+1 {{to match this '('}}
39cb424feeSJennifer Yu #pragma omp dispatch novariants (
40cb424feeSJennifer Yu disp_call();
41cb424feeSJennifer Yu
42cb424feeSJennifer Yu // expected-error@+1 {{cannot contain more than one 'novariants' clause}}
43cb424feeSJennifer Yu #pragma omp dispatch novariants(dnum> 4) novariants(3)
44cb424feeSJennifer Yu disp_call();
45cb424feeSJennifer Yu
46cb424feeSJennifer Yu // expected-error@+1 {{use of undeclared identifier 'x'}}
47cb424feeSJennifer Yu #pragma omp dispatch novariants(x)
48cb424feeSJennifer Yu disp_call();
49*7078ef47SJennifer Yu
50*7078ef47SJennifer Yu // expected-error@+1 {{expected '(' after 'nocontext'}}
51*7078ef47SJennifer Yu #pragma omp dispatch nocontext
52*7078ef47SJennifer Yu disp_call();
53*7078ef47SJennifer Yu
54*7078ef47SJennifer Yu // expected-error@+3 {{expected expression}}
55*7078ef47SJennifer Yu // expected-error@+2 {{expected ')'}}
56*7078ef47SJennifer Yu // expected-note@+1 {{to match this '('}}
57*7078ef47SJennifer Yu #pragma omp dispatch nocontext (
58*7078ef47SJennifer Yu disp_call();
59*7078ef47SJennifer Yu
60*7078ef47SJennifer Yu // expected-error@+1 {{cannot contain more than one 'nocontext' clause}}
61*7078ef47SJennifer Yu #pragma omp dispatch nocontext(dnum> 4) nocontext(3)
62*7078ef47SJennifer Yu disp_call();
63*7078ef47SJennifer Yu
64*7078ef47SJennifer Yu // expected-error@+1 {{use of undeclared identifier 'x'}}
65*7078ef47SJennifer Yu #pragma omp dispatch nocontext(x)
66*7078ef47SJennifer Yu disp_call();
67b7899ba0SMike Rice }
68b7899ba0SMike Rice
testit_two()69b7899ba0SMike Rice void testit_two() {
70b7899ba0SMike Rice //expected-error@+2 {{cannot return from OpenMP region}}
71b7899ba0SMike Rice #pragma omp dispatch
72b7899ba0SMike Rice return disp_call();
73b7899ba0SMike Rice }
74b7899ba0SMike Rice
testit_three(int (* fptr)(void),Obj * obj,int (Obj::* mptr)(void))75b7899ba0SMike Rice void testit_three(int (*fptr)(void), Obj *obj, int (Obj::*mptr)(void)) {
76b7899ba0SMike Rice //expected-error@+2 {{statement after '#pragma omp dispatch' must be a direct call to a target function or an assignment to one}}
77b7899ba0SMike Rice #pragma omp dispatch
78b7899ba0SMike Rice fptr();
79b7899ba0SMike Rice
80b7899ba0SMike Rice //expected-error@+2 {{statement after '#pragma omp dispatch' must be a direct call to a target function or an assignment to one}}
81b7899ba0SMike Rice #pragma omp dispatch
82b7899ba0SMike Rice (obj->*mptr)();
83b7899ba0SMike Rice
84b7899ba0SMike Rice int ret;
85b7899ba0SMike Rice
86b7899ba0SMike Rice //expected-error@+2 {{statement after '#pragma omp dispatch' must be a direct call to a target function or an assignment to one}}
87b7899ba0SMike Rice #pragma omp dispatch
88b7899ba0SMike Rice ret = fptr();
89b7899ba0SMike Rice
90b7899ba0SMike Rice //expected-error@+2 {{statement after '#pragma omp dispatch' must be a direct call to a target function or an assignment to one}}
91b7899ba0SMike Rice #pragma omp dispatch
92b7899ba0SMike Rice ret = (obj->*mptr)();
93b7899ba0SMike Rice }
94b7899ba0SMike Rice
testit_four(int * x,int y,Obj * obj)95b7899ba0SMike Rice void testit_four(int *x, int y, Obj *obj)
96b7899ba0SMike Rice {
97b7899ba0SMike Rice //expected-error@+2 {{statement after '#pragma omp dispatch' must be a direct call to a target function or an assignment to one}}
98b7899ba0SMike Rice #pragma omp dispatch
99b7899ba0SMike Rice *x = y;
100b7899ba0SMike Rice
101b7899ba0SMike Rice //expected-error@+2 {{statement after '#pragma omp dispatch' must be a direct call to a target function or an assignment to one}}
102b7899ba0SMike Rice #pragma omp dispatch
103b7899ba0SMike Rice y = disp_call() + disp_call();
104b7899ba0SMike Rice
105b7899ba0SMike Rice //expected-error@+2 {{statement after '#pragma omp dispatch' must be a direct call to a target function or an assignment to one}}
106b7899ba0SMike Rice #pragma omp dispatch
107b7899ba0SMike Rice y = (y = disp_call());
108b7899ba0SMike Rice
109b7899ba0SMike Rice //expected-error@+2 {{statement after '#pragma omp dispatch' must be a direct call to a target function or an assignment to one}}
110b7899ba0SMike Rice #pragma omp dispatch
111b7899ba0SMike Rice y += disp_call();
112b7899ba0SMike Rice
113b7899ba0SMike Rice //expected-error@+2 {{statement after '#pragma omp dispatch' must be a direct call to a target function or an assignment to one}}
114b7899ba0SMike Rice #pragma omp dispatch
115b7899ba0SMike Rice for (int I = 0; I < 8; ++I) {
116b7899ba0SMike Rice disp_call();
117b7899ba0SMike Rice }
118b7899ba0SMike Rice }
119