https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107439
Patrick Palka <ppalka at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |ppalka at gcc dot gnu.org
--- Comment #1 from Patrick Palka <ppalka at gcc dot gnu.org> ---
> This seems inconsistent, as member functions are normally expected to be
> usable anywhere within the class definition.
IIUC associated constraints are part of the function signature and thus aren't
late parsed like the function body is, so later-declared members aren't
generally usable in a constraint.
Interestingly, if we add a dummy argument to 'check' then we accept the call
(and treat it as an ADL-enabled call to an unknown function template where
unqualified lookup found nothing):
struct A
{
template<typename T> requires (check<T>(0))
auto func(T) { }
template<typename T>
static consteval bool check(0) { return true; }
};
But if we then try to actually use func, its constraint will always fail due to
'check' not being visible at the point of use (since associated constraints
aren't late-parsed):
int main() {
A a;
a.func(0); // error: ‘check’ was not declared in this scope, and no
declarations were found by argument-dependent lookup at the point of
instantiation
}
This behavior (for the modified testcase) is correct AFAICT (Clang behaves the
same).