/* { dg-additional-options "-fdump-tree-gimple" } */

/* Check that append_args is not applied when the outermost function
   in '#pragma omp dispatch' is not variant substituted.  */

#if __cplusplus >= 201103L
# define __GOMP_UINTPTR_T_ENUM : __UINTPTR_TYPE__
#else
# define __GOMP_UINTPTR_T_ENUM
#endif

typedef enum omp_interop_t __GOMP_UINTPTR_T_ENUM
{
  omp_interop_none = 0,
  __omp_interop_t_max__ = __UINTPTR_MAX__
} omp_interop_t;

int v1(int, omp_interop_t);
#pragma omp declare variant(v1) match(construct={dispatch},user={condition(1)}) append_args(interop(targetsync))
int b1(int);

int v2(int);
int v2a(int);
#pragma omp declare variant(v2) match(construct={dispatch},user={condition(1)})
#pragma omp declare variant(v2a) match(user={condition(1)})
int b2(int);


int test (int y1, int y2, int y3, int y4, int num1, int num2, int num3, int num4)
{
  int x1, x2, x3, x4; 
  omp_interop_t obj = omp_interop_none;

  #pragma omp dispatch device(num1) interop(obj)
    x1 = v1 (b2 (y1), omp_interop_none);

  /* No variant substitution because of nocontext */
  #pragma omp dispatch device(num2) nocontext(1) interop(obj)
    x2 = b1 (b2 (y2));

  /* No variant substitution because of novariants */
  #pragma omp dispatch device(num2) novariants(1) interop(obj)
    x3 = b1 (b2 (y3));

  /* OK */
  #pragma omp dispatch device(num4) nocontext(0) interop(obj)
    x4 = b1 (b2 (y4));

  return x1 + x2 + x3 + x4;
}