|  | /* Check OMP_TARGET_OFFLOAD on systems with non-host devices but no executable | 
|  | code due to -foffload=disable. | 
|  |  | 
|  | Note: While one might expect that -foffload=disable implies no non-host | 
|  | devices, libgomp actually detects the devices and only fails when trying to | 
|  | run as no executable code is availale for that device. | 
|  | (Without MANDATORY it simply uses host fallback, which should usually be fine | 
|  | but might have issues in corner cases.) | 
|  |  | 
|  | We have default-device-var = 0 (default but also explicitly set), which will | 
|  | fail at runtime. For -foffload=disable without non-host devices, see | 
|  | target-50.c testcase.  */ | 
|  |  | 
|  | /* { dg-do run { target offload_device } } */ | 
|  |  | 
|  | /* { dg-additional-options "-foffload=disable" } */ | 
|  | /* { dg-set-target-env-var OMP_TARGET_OFFLOAD "mandatory" } */ | 
|  | /* { dg-set-target-env-var OMP_DEFAULT_DEVICE "0" } */ | 
|  | /* { dg-set-target-env-var OMP_DISPLAY_ENV "true" } */ | 
|  |  | 
|  | /* { dg-output ".*OMP_DEFAULT_DEVICE = '0'.*OMP_TARGET_OFFLOAD = 'MANDATORY'.*" } */ | 
|  |  | 
|  | #include <omp.h> | 
|  |  | 
|  | int | 
|  | main () | 
|  | { | 
|  | int x; | 
|  | /* We know that there are non-host devices. With GCC, we still find them as | 
|  | available devices, hence, check for it.  */ | 
|  | if (omp_get_num_devices() <= 0) | 
|  | __builtin_abort (); | 
|  |  | 
|  | /* But due to -foffload=disable, there are no binary code for (default) device '0'  */ | 
|  |  | 
|  | /* { dg-output ".*libgomp: OMP_TARGET_OFFLOAD is set to MANDATORY, but device cannot be used for offloading.*" } */ | 
|  | /* { dg-shouldfail "OMP_TARGET_OFFLOAD=mandatory and no binary code for a non-host device" } */ | 
|  | #pragma omp target map(tofrom:x) | 
|  | x = 5; | 
|  | if (x != 5) | 
|  | __builtin_abort (); | 
|  | return 0; | 
|  | } |