https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119602

--- Comment #1 from Alex <waffl3x at gcc dot gnu.org> ---
I somehow botched the test case in my original post,
here is the fixed version.
https://godbolt.org/z/no9Pbv78K
```
typedef enum omp_interop_t : __UINTPTR_TYPE__
{
  omp_interop_none = 0
} omp_interop_t;

typedef enum omp_interop_fr_t
{
  omp_ifr_cuda = 1,
  omp_ifr_cuda_driver = 2,
  omp_ifr_opencl = 3,
  omp_ifr_sycl = 4,
  omp_ifr_hip = 5,
  omp_ifr_level_zero = 6,
  omp_ifr_hsa = 7,
  omp_ifr_last = omp_ifr_hsa
} omp_interop_fr_t;

template<omp_interop_fr_t V>
struct FR {};

template<omp_interop_fr_t V, typename T2>
void v_dependent_fr(FR<V> x, T2 y) { }

#pragma omp declare variant(v_dependent_fr) match(construct={dispatch}) \
                                            append_args(interop(target, \
                                                               
prefer_type(V)))
template<omp_interop_fr_t V>
void b_dependent_fr(FR<V> x) { }


template<typename T, typename T2>
void v_cuda(T x, T2 y) { }

#pragma omp declare variant(v_cuda) match(construct={dispatch}) \
                                    append_args(interop(target, \
                                                       
prefer_type(omp_ifr_cuda_driver)))
template<typename T>
void b_cuda(T x) { }


template<typename T, typename T2>
void v_hip(T x, T2 y) { }

#pragma omp declare variant(v_hip) match(construct={dispatch}) \
                                   append_args(interop(target, \
                                                      
prefer_type(omp_ifr_hip)))
template<typename T>
void b_hip(T x) { }


template<typename T, typename T2>
void v_hsa(T x, T2 y) { }

#pragma omp declare variant(v_hsa) match(construct={dispatch}) \
                                   append_args(interop(target, \
                                                      
prefer_type(omp_ifr_hsa)))
template<typename T>
void b_hsa(T x) { }

void f ()
{
  #pragma omp dispatch
  b_dependent_fr (FR<omp_ifr_cuda_driver>{});

  #pragma omp dispatch
  b_dependent_fr (FR<omp_ifr_hip>{});

  #pragma omp dispatch
  b_dependent_fr (FR<omp_ifr_level_zero>{});

  #pragma omp dispatch
  b_dependent_fr (FR<omp_ifr_hsa>{});

  #pragma omp dispatch
  b_cuda (0);

  #pragma omp dispatch
  b_hip (0);

  #pragma omp dispatch
  b_hsa (0);
}
```

Reply via email to