119 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C++
		
	
	
	
// RUN: %clang_cc1 -triple=x86_64-pc-win32 -verify -fopenmp    \
 | 
						|
// RUN:   -x c++ -std=c++14 -fexceptions -fcxx-exceptions %s
 | 
						|
 | 
						|
// RUN: %clang_cc1 -triple=x86_64-pc-linux-gnu -verify -fopenmp \
 | 
						|
// RUN:   -x c++ -std=c++14 -fexceptions -fcxx-exceptions %s
 | 
						|
 | 
						|
int disp_variant();
 | 
						|
#pragma omp declare variant(disp_variant) \
 | 
						|
    match(construct = {dispatch}, device = {arch(arm)})
 | 
						|
int disp_call();
 | 
						|
 | 
						|
struct Obj {
 | 
						|
  int disp_method_variant1();
 | 
						|
  #pragma omp declare variant(disp_method_variant1)                            \
 | 
						|
    match(construct={dispatch}, device={arch(arm)})
 | 
						|
  int disp_method1();
 | 
						|
  int disp_method_variant2();
 | 
						|
  #pragma omp declare variant(disp_method_variant2)                            \
 | 
						|
    match(construct={dispatch}, device={arch(arm)})
 | 
						|
  int disp_method2();
 | 
						|
};
 | 
						|
 | 
						|
void testit_one(int dnum) {
 | 
						|
  // expected-error@+1 {{cannot contain more than one 'device' clause}}
 | 
						|
  #pragma omp dispatch device(dnum) device(3)
 | 
						|
  disp_call();
 | 
						|
 | 
						|
  // expected-error@+1 {{cannot contain more than one 'nowait' clause}}
 | 
						|
  #pragma omp dispatch nowait device(dnum) nowait
 | 
						|
  disp_call();
 | 
						|
 | 
						|
  // expected-error@+1 {{expected '(' after 'novariants'}}
 | 
						|
  #pragma omp dispatch novariants
 | 
						|
  disp_call();
 | 
						|
 | 
						|
  // expected-error@+3 {{expected expression}}
 | 
						|
  // expected-error@+2 {{expected ')'}}
 | 
						|
  // expected-note@+1 {{to match this '('}}
 | 
						|
  #pragma omp dispatch novariants (
 | 
						|
  disp_call();
 | 
						|
 | 
						|
  // expected-error@+1 {{cannot contain more than one 'novariants' clause}}
 | 
						|
  #pragma omp dispatch novariants(dnum> 4) novariants(3)
 | 
						|
  disp_call();
 | 
						|
 | 
						|
  // expected-error@+1 {{use of undeclared identifier 'x'}}
 | 
						|
  #pragma omp dispatch novariants(x)
 | 
						|
  disp_call();
 | 
						|
  
 | 
						|
  // expected-error@+1 {{expected '(' after 'nocontext'}}
 | 
						|
  #pragma omp dispatch nocontext
 | 
						|
  disp_call();
 | 
						|
 | 
						|
  // expected-error@+3 {{expected expression}}
 | 
						|
  // expected-error@+2 {{expected ')'}}
 | 
						|
  // expected-note@+1 {{to match this '('}}
 | 
						|
  #pragma omp dispatch nocontext (
 | 
						|
  disp_call();
 | 
						|
 | 
						|
  // expected-error@+1 {{cannot contain more than one 'nocontext' clause}}
 | 
						|
  #pragma omp dispatch nocontext(dnum> 4) nocontext(3)
 | 
						|
  disp_call();
 | 
						|
 | 
						|
  // expected-error@+1 {{use of undeclared identifier 'x'}}
 | 
						|
  #pragma omp dispatch nocontext(x)
 | 
						|
  disp_call();
 | 
						|
}
 | 
						|
 | 
						|
void testit_two() {
 | 
						|
  //expected-error@+2 {{cannot return from OpenMP region}}
 | 
						|
  #pragma omp dispatch
 | 
						|
  return disp_call();
 | 
						|
}
 | 
						|
 | 
						|
void testit_three(int (*fptr)(void), Obj *obj, int (Obj::*mptr)(void)) {
 | 
						|
  //expected-error@+2 {{statement after '#pragma omp dispatch' must be a direct call to a target function or an assignment to one}}
 | 
						|
  #pragma omp dispatch
 | 
						|
  fptr();
 | 
						|
 | 
						|
  //expected-error@+2 {{statement after '#pragma omp dispatch' must be a direct call to a target function or an assignment to one}}
 | 
						|
  #pragma omp dispatch
 | 
						|
  (obj->*mptr)();
 | 
						|
 | 
						|
  int ret;
 | 
						|
 | 
						|
  //expected-error@+2 {{statement after '#pragma omp dispatch' must be a direct call to a target function or an assignment to one}}
 | 
						|
  #pragma omp dispatch
 | 
						|
  ret = fptr();
 | 
						|
 | 
						|
  //expected-error@+2 {{statement after '#pragma omp dispatch' must be a direct call to a target function or an assignment to one}}
 | 
						|
  #pragma omp dispatch
 | 
						|
  ret = (obj->*mptr)();
 | 
						|
}
 | 
						|
 | 
						|
void testit_four(int *x, int y, Obj *obj)
 | 
						|
{
 | 
						|
  //expected-error@+2 {{statement after '#pragma omp dispatch' must be a direct call to a target function or an assignment to one}}
 | 
						|
  #pragma omp dispatch
 | 
						|
  *x = y;
 | 
						|
 | 
						|
  //expected-error@+2 {{statement after '#pragma omp dispatch' must be a direct call to a target function or an assignment to one}}
 | 
						|
  #pragma omp dispatch
 | 
						|
  y = disp_call() + disp_call();
 | 
						|
 | 
						|
  //expected-error@+2 {{statement after '#pragma omp dispatch' must be a direct call to a target function or an assignment to one}}
 | 
						|
  #pragma omp dispatch
 | 
						|
  y = (y = disp_call());
 | 
						|
 | 
						|
  //expected-error@+2 {{statement after '#pragma omp dispatch' must be a direct call to a target function or an assignment to one}}
 | 
						|
  #pragma omp dispatch
 | 
						|
  y += disp_call();
 | 
						|
 | 
						|
  //expected-error@+2 {{statement after '#pragma omp dispatch' must be a direct call to a target function or an assignment to one}}
 | 
						|
  #pragma omp dispatch
 | 
						|
  for (int I = 0; I < 8; ++I) {
 | 
						|
    disp_call();
 | 
						|
  }
 | 
						|
}
 |