This is ill-formed per [basic.scope.class]p2.
This is done by tracking all unqualified lookups performed within the
scope of a class definition that find nothing within the class, and
checking for conflicting declarations later introduced into the class.
Not really about this patch, but take given the following example:
It looks like every compiler somehow parses this as an invalid constructor declaration. As far as I can tell, it doesn't conform to the grammar for a constructor, though: parentheses aren't allowed after the parameter-declaration-clause. So it should declare a member function f, whether or not f is a type. Maybe I'm missing something, though.
It doesn't matter for this patch, of course, because you can also write C(f());, which actually depends on whether f is a type.