We should look through implicit casts before determining the type of the arguments, and only allow explicit cast to _Nonnull to suppress warning
void foo(NSString *_Nonnull); foo((NSString * _Nonnull)nil); // no-warning id obj = nil; foo(obj); // should warning here (implicit cast id to NSString *_Nonnull)
I think there should be a warning when we call the foo: method