The old behavior was to return a function which could be used to call a method (the method implementation), or NULL when the receiver does not implement the method.
The new behavior is (when the receiver forwards) to return the forwarding hook (__objc_msg_forward2) which, instead of calling the method, returns the method implementation.
That breaks any code which expects to be able to use the returned function to call a method.
IMO the correct behavior is the original behavior or to return a function which calls __objc_msg_forward2, then calls the function returned by __objc_msg_forward2, and returns the result.
The old behavior was to return a function which could be used to call a method (the method implementation), or NULL when the receiver does not implement the method.
The new behavior is (when the receiver forwards) to return the forwarding hook (__objc_msg_forward2) which, instead of calling the method, returns the method implementation.
That breaks any code which expects to be able to use the returned function to call a method.
IMO the correct behavior is the original behavior or to return a function which calls __objc_msg_forward2, then calls the function returned by __objc_msg_forward2, and returns the result.