// PR c++/102670
// { dg-do compile { target c++20 } }
namespace ns {
  struct S { };
  template<int I>
  constexpr int adl(const S &) {
    return I;
  }
}
namespace redirect {
  template<class T, int I>
  concept can_call_adl = requires(T t) {
    adl<I>(t);
  };
  template<int I>
  struct adl_fn {
    template<can_call_adl<I> T>
    constexpr decltype(auto) operator()(T t) const {
      return adl<I>(t);
    }
  };
  namespace {
    template<int I>
    constexpr inline adl_fn<I> adl{};
  }
}
int main() {
  static_assert(redirect::can_call_adl<ns::S, 3>);
  redirect::adl<3>(ns::S{});
}