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); } ```