https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118791
Jason Merrill <jason at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|ASSIGNED |WAITING --- Comment #6 from Jason Merrill <jason at gcc dot gnu.org> --- omp_declare_variant_finalize_one works by building a forwarding call to the variant, i.e. rvalue_int_variant(std::forward<T&&>(p)). Normal template argument deduction from T&& vs int&& then deduces int for T, as substituting int for T produces int&&, which is the desired type. Note that the decltype checks pass. It's not clear to me that this behavior is wrong; the OpenMP standard says nothing about templates.