https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65681

--- Comment #1 from Andrew Sutton <andrew.n.sutton at gmail dot com> ---
This is a good one. It is a regression, but it didn't have to do with the
resolution of partial specializations.

The substitution into requires-expressions was too eagerly doing full semantic
on analysis on simple and compound requirements, and that was causing a later
constraint check for a member function to fail unexpectedly.

Substituting a concrete type (say, MA2) into the constraint !CA2<MA2> is
generating a requirement for the expression t.MA2::mf(). When we go to check
that letter, we perform another substitution with the expectation that, in this
case, the result would be identical to the original since it's already been
resolved. However, the substitution actually rebuilds the call expression and
tries to resolve it as MA2::mf(t), which fails.

Anyways, this is resolved by deferring all semantic analysis to constraint
checking, and not allowing it to happen when we substitute into requirements.

Fixed in r222236.

Reply via email to