https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118791
--- Comment #3 from sandra at gcc dot gnu.org --- Curiously, on the OG14 development branch the rvalue calls work but the lvalue ones are broken instead: $ install/bin/x86_64-none-linux-gnu-g++ -fopenmp -S quux.C quux.C: In instantiation of 'void lvalue_int_variant(T&&) [with T = int&&]': quux.C:21:30: required by substitution of 'template<class T> void lvalue_int(T&&) [with T = int&]' 21 | #pragma omp declare variant (lvalue_int_variant) match (implementation={vendor("gnu")}) | ^~~~~~~~~~~~~~~~~~ quux.C:76:19: required from here 76 | lvalue_int<int&>(lvalue); | ~~~~~~~~~~~~~~~~^~~~~~~~ quux.C:16:35: error: static assertion failed 16 | static_assert(is_same<T, int&>::value); | ^~~~~ quux.C:16:35: note: 'is_same<int&&, int&>::value' evaluates to false quux.C: In instantiation of 'void lvalue_const_int_variant(T&&) [with T = const int&&]': quux.C:36:30: required by substitution of 'template<class T> void lvalue_const_int(T&&) [with T = const int&]' 36 | #pragma omp declare variant (lvalue_const_int_variant) match (implementation={vendor("gnu")}) | ^~~~~~~~~~~~~~~~~~~~~~~~ quux.C:77:31: required from here 77 | lvalue_const_int<int const&>(static_cast<int const&>(lvalue)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ quux.C:31:41: error: static assertion failed 31 | static_assert(is_same<T, int const&>::value); | ^~~~~ quux.C:31:41: note: 'is_same<const int&&, const int&>::value' evaluates to false So this might actually be a regression in GCC 15 -- perhaps the fix for the lvalue case ended up breaking the rvalue case instead. Probably should double-check against the GCC 15 branch point to ensure the different behavior is not specific to the OG15 branch, then git bisect.