/* { dg-do compile } */
/* { dg-additional-options "-fdump-tree-optimized" } */

/* In configurations without offloading configured, we can resolve many
   instances of the target_device context selector at gimplification time
   instead of waiting until late resolution.  */

/* Device 0 may be either the host or an offloading device, in configurations
   that support them.  */
void
f1 (int n, double* a, double s)
{
#pragma omp metadirective					\
  when (target_device={device_num(0), kind(host)}		\
	: parallel for)						\
  default (error at(execution) message("f1 match failed"))
  for (int i = 0; i < n; i++)
    a[i] = a[i] * s;
}
/* { dg-final { scan-tree-dump-not "f1 match failed" "optimized" { target { ! offloading_enabled } } } } */
/* { dg-final { scan-tree-dump "f1 match failed" "optimized" { target offloading_enabled } } } */

/* Device -1 is always the host, even in offloading configurations.  */
void
f2 (int n, double* a, double s)
{
#pragma omp metadirective					\
  when (target_device={device_num(-1), kind(host)}		\
	: parallel for)						\
  default (error at(execution) message("f2 match failed"))
  for (int i = 0; i < n; i++)
    a[i] = a[i] * s;
}
/* { dg-final { scan-tree-dump-not "f2 match failed" "optimized" } } */

/* Constant device numbers < -1 cause the match to fail, even in offloading
   configurations.  */
void
f3 (int n, double* a, double s)
{
#pragma omp metadirective					\
  when (target_device={device_num(-42), kind(host)}		\
	: error at(execution) message("f3 match failed"))	\
  default (parallel for)
  for (int i = 0; i < n; i++)
    a[i] = a[i] * s;
}
/* { dg-final { scan-tree-dump-not "f3 match failed" "optimized" } } */

/* In a non-offloading configuration, devices > 0 are always invalid and
   will cause the match to fail.  In an offload configuration, we don't
   know at compile-time if the device number is valid or if it refers to
   a host or offload device.  */
void
f4 (int n, double* a, double s)
{
#pragma omp metadirective					\
  when (target_device={device_num(42), kind(host)}		\
	: error at(execution) message("f4 match failed"))	\
  default (parallel for)
  for (int i = 0; i < n; i++)
    a[i] = a[i] * s;
}
/* { dg-final { scan-tree-dump-not "f4 match failed" "optimized" { target { ! offloading_enabled } } } } */
/* { dg-final { scan-tree-dump "f4 match failed" "optimized" { target offloading_enabled } } } */

extern int omp_get_initial_device (void);
extern int omp_get_default_device (void);
extern int omp_get_num_devices (void);
extern int omp_get_device_num (void);

/* On a non-offloading configuration, omp_get_default_device() always refers
   to the host.  With offloading, we know it's a valid device number but
   not whether it's the host.  */
void
f5 (int n, double* a, double s)
{
#pragma omp metadirective					\
  when (target_device={device_num(omp_get_default_device ()), kind(host)} \
	: parallel for)						\
  default (error at(execution) message("f5 match failed"))
  for (int i = 0; i < n; i++)
    a[i] = a[i] * s;
}
/* { dg-final { scan-tree-dump-not "f5 match failed" "optimized" { target { ! offloading_enabled } } } } */
/* { dg-final { scan-tree-dump "f5 match failed" "optimized" { target offloading_enabled } } } */

/* omp_get_initial_device() always refers to the host, whether offloading is
   configured or not.  */
void
f6 (int n, double* a, double s)
{
#pragma omp metadirective					\
  when (target_device={device_num(omp_get_initial_device ()), kind(host)} \
	: parallel for)						\
  default (error at(execution) message("f6 match failed"))
  for (int i = 0; i < n; i++)
    a[i] = a[i] * s;
}
/* { dg-final { scan-tree-dump-not "f6 match failed" "optimized" } } */

/* omp_get_num_devices() returns the number of non-host offload devices,
   therefore using it as a device number always refers to the host, whether
   offloading is enabled or not.  */
void
f7 (int n, double* a, double s)
{
#pragma omp metadirective					\
  when (target_device={device_num(omp_get_num_devices ()), kind(host)} \
	: parallel for)						\
  default (error at(execution) message("f7 match failed"))
  for (int i = 0; i < n; i++)
    a[i] = a[i] * s;
}
/* { dg-final { scan-tree-dump-not "f7 match failed" "optimized" } } */

/* omp_get_device_num() always returns a valid device number but we don't
   know whether it's the host or offload device, in configurations that
   support offloading.  */
void
f8 (int n, double* a, double s)
{
#pragma omp metadirective					\
  when (target_device={device_num(omp_get_device_num ()), kind(host)} \
	: parallel for)						\
  default (error at(execution) message("f8 match failed"))
  for (int i = 0; i < n; i++)
    a[i] = a[i] * s;
}
/* { dg-final { scan-tree-dump-not "f8 match failed" "optimized" { target { ! offloading_enabled } } } } */
/* { dg-final { scan-tree-dump "f8 match failed" "optimized" { target offloading_enabled } } } */

