// PR c++/93377 // { dg-do compile { target c++20 } } struct empty {}; template <typename c> c value; template <typename c> auto func(value<c>); template <typename, typename...> struct alignment_algorithm; template <typename... args_t> struct select { template <typename algorithm_t, typename... _args_t> decltype(algorithm_t()(func<_args_t>...)) choose(); template <typename...> static empty choose(); using type = decltype(choose<alignment_algorithm<int>, args_t...>()); }; template <typename, typename... args_t> struct select_algorithm : select<args_t...> {}; template <typename, typename = void> struct maybe_value { int value; }; template <typename cn> struct maybe_value<cn, typename cn::sfinae>; struct function { template <typename algorithm_t, typename = decltype( maybe_value<select_algorithm<algorithm_t, int>>::value)> function(algorithm_t); }; template <typename> struct alignment_configuration_traits { static constexpr bool is_vectorised = 0; }; template <typename config_t, typename...> struct alignment_algorithm { using traits_t = alignment_configuration_traits<config_t>; template <typename indexed_sequence_pairs_t> void operator()(indexed_sequence_pairs_t) requires traits_t::is_vectorised; }; int main() { function{alignment_algorithm<int>{}}; }