// RUN: %clang_cc1 -verify -fopenmp -std=c++11 -o - -DWITHDEF %s
// RUN: %clang_cc1 -verify -fopenmp -std=c++11 -o - -DWITHOUTDEF %s

#ifdef WITHDEF
typedef void *omp_interop_t;

void foo(int *Ap) {
  omp_interop_t InteropVar;
  omp_interop_t Another;

  //expected-error@+1 {{expected interop type: 'target' and/or 'targetsync'}}
  #pragma omp interop init(target,foo:InteropVar) init(target:Another)

  //expected-error@+1 {{use of undeclared identifier 'NoDeclVar'}}
  #pragma omp interop init(target:NoDeclVar) init(target:Another)

  //expected-error@+1 {{use of undeclared identifier 'NoDeclVar'}}
  #pragma omp interop use(NoDeclVar) use(Another)

  //expected-error@+1 {{use of undeclared identifier 'NoDeclVar'}}
  #pragma omp interop destroy(NoDeclVar) destroy(Another)

  //expected-error@+2 {{expected interop type: 'target' and/or 'targetsync'}}
  //expected-error@+1 {{expected expression}}
  #pragma omp interop init(InteropVar) init(target:Another)

  //expected-warning@+1 {{missing ':' after interop types}}
  #pragma omp interop init(target InteropVar)

  //expected-error@+1 {{expected expression}}
  #pragma omp interop init(prefer_type(1,+,3),target:InteropVar) \
                      init(target:Another)

  int IntVar;
  struct S { int I; } SVar;

  //expected-error@+1 {{interop variable must be of type 'omp_interop_t'}}
  #pragma omp interop init(prefer_type(1,"sycl",3),target:IntVar) \
                      init(target:Another)

  //expected-error@+1 {{interop variable must be of type 'omp_interop_t'}}
  #pragma omp interop use(IntVar) use(Another)

  //expected-error@+1 {{interop variable must be of type 'omp_interop_t'}}
  #pragma omp interop destroy(IntVar) destroy(Another)

  //expected-error@+1 {{interop variable must be of type 'omp_interop_t'}}
  #pragma omp interop init(prefer_type(1,"sycl",3),target:SVar) \
                      init(target:Another)

  //expected-error@+1 {{interop variable must be of type 'omp_interop_t'}}
  #pragma omp interop use(SVar) use(Another)

  //expected-error@+1 {{interop variable must be of type 'omp_interop_t'}}
  #pragma omp interop destroy(SVar) destroy(Another)

  int a, b;
  //expected-error@+1 {{expected variable of type 'omp_interop_t'}}
  #pragma omp interop init(target:a+b) init(target:Another)

  //expected-error@+1 {{expected variable of type 'omp_interop_t'}}
  #pragma omp interop use(a+b) use(Another)

  //expected-error@+1 {{expected variable of type 'omp_interop_t'}}
  #pragma omp interop destroy(a+b) destroy(Another)

  const omp_interop_t C = (omp_interop_t)5;
  //expected-error@+1 {{expected non-const variable of type 'omp_interop_t'}}
  #pragma omp interop init(target:C) init(target:Another)

  //expected-error@+1 {{expected non-const variable of type 'omp_interop_t'}}
  #pragma omp interop destroy(C) destroy(Another)

  //expected-error@+1 {{prefer_list item must be a string literal or constant integral expression}}
  #pragma omp interop init(prefer_type(1.0),target:InteropVar) \
                      init(target:Another)

  //expected-error@+1 {{prefer_list item must be a string literal or constant integral expression}}
  #pragma omp interop init(prefer_type(a),target:InteropVar) \
                      init(target:Another)

  //expected-error@+1 {{expected at least one 'init', 'use', 'destroy', or 'nowait' clause for '#pragma omp interop'}}
  #pragma omp interop device(0)

  //expected-warning@+1 {{interop type 'target' cannot be specified more than once}}
  #pragma omp interop init(target,targetsync,target:InteropVar)

  //expected-error@+1 {{'depend' clause requires the 'targetsync' interop type}}
  #pragma omp interop init(target:InteropVar) depend(inout:Ap)

  //expected-error@+1 {{interop variable 'InteropVar' used in multiple action clauses}}
  #pragma omp interop init(target:InteropVar) init(target:InteropVar)

  //expected-error@+1 {{interop variable 'InteropVar' used in multiple action clauses}}
  #pragma omp interop use(InteropVar) use(InteropVar)

  //expected-error@+1 {{interop variable 'InteropVar' used in multiple action clauses}}
  #pragma omp interop destroy(InteropVar) destroy(InteropVar)

  //expected-error@+1 {{interop variable 'InteropVar' used in multiple action clauses}}
  #pragma omp interop init(target:InteropVar) use(InteropVar)

  //expected-error@+1 {{interop variable 'InteropVar' used in multiple action clauses}}
  #pragma omp interop init(target:InteropVar) destroy(InteropVar)

  //expected-error@+1 {{interop variable 'InteropVar' used in multiple action clauses}}
  #pragma omp interop use(InteropVar) destroy(InteropVar)

  //expected-error@+1 {{directive '#pragma omp interop' cannot contain more than one 'device' clause}}
  #pragma omp interop init(target:InteropVar) device(0) device(1)

  //expected-error@+1 {{argument to 'device' clause must be a non-negative integer value}}
  #pragma omp interop init(target:InteropVar) device(-4)

  //expected-error@+1 {{directive '#pragma omp interop' cannot contain more than one 'nowait' clause}}
  #pragma omp interop nowait init(target:InteropVar) nowait
}
#endif
#ifdef WITHOUTDEF
void foo() {
  int InteropVar;
  //expected-error@+1 {{'omp_interop_t' type not found; include <omp.h>}}
  #pragma omp interop init(prefer_type(1,"sycl",3),target:InteropVar) nowait
  //expected-error@+1 {{'omp_interop_t' type not found; include <omp.h>}}
  #pragma omp interop use(InteropVar) nowait
  //expected-error@+1 {{'omp_interop_t' type not found; include <omp.h>}}
  #pragma omp interop destroy(InteropVar) nowait
}
#endif
