It looks like there's no actual loss of safety here, because self isn't actually the object being initialized. I'm not quite sure what it is, and we should fix this, but it's not doing what you think it is.
<stdin>:9:11: error: value of type '(NSObject) -> () -> A' has no member 'x'
Approach 1: In contexts where self does not refer to an instance (i.e. outside of instance methods bodies and instance property bodies), references to the self method should be either qualified (so Foo.self) or the identifier is escaped with backticks (so `self`), otherwise, there is a warning. (say "self in a stored property initializer refers to the method NSObject.self, which may be unexpected" "add NSObject. to disable this warning" with fix-it). The best place to implement this is in PreCheckExpr.cpp, probably in resolveDeclRefExpr()
Approach 2: Implemented as a fix in constraint system, similar to AddQualifierToAccessTopLevelName that currently detects some forms of name shadowing. You'd likely have to implement a tailored fix for this situation and check all conversions from a function type to Any to make sure that function type doesn’t originate from an unapplied reference to member self on NSObject.
Thanks a bunch theindigamer (JIRA User) for getting those notes! Went with approach 1 and made fix generic as isn't just for NSObject, it can also occur for any type that has/inherits a function called 'self'.