If the caller doesn't know the prototype, the value is not correctly forwarded it seems. So **X** declares `- (void) setFoo:(double) x;` but that is not know to the caller. In this case if **Y** forwards, the value is incorrect.