> On May 6, 2016, at 11:28 AM, Jens Alfke <[email protected]> wrote:
> 
> I just had a bizarre failure in a new unit test, which I finally tracked down 
> to a callback block returning NO when it should have returned YES. In fact 
> I’d forgotten to add “return YES” at the end of the block, which the compiler 
> should have flagged as an error — instead it somehow synthesized a NO return.

It is probably just falling off the end and leaving the result uninitialized.

> I reduced it down to the following invalid code, which compiles without 
> warnings or errors:
> 
>     BOOL (^block)();
>     block = ^BOOL {
>         @try {
>         } @catch (...) {
>         }
>     };
> 
> It looks like as soon as you add an @try statement to a block, the compiler 
> stops enforcing that the block has to return a value. Yikes! In my original 
> code, the @try was hidden inside the definition of the XCTAssert() macro, so 
> an equivalent test case is
> 
>     BOOL (^block)();
>     block = ^BOOL {
>         XCTAssert(2 + 2 == 4);
>     };
> 
> I’m 99% certain this is a Clang bug, but I thought I’d ask first in case any 
> of you rules lawyers can think of a reason this should be valid :)

It's likely that the compiler is just being more conservative about control 
flow in the presence of try/catch, but I think we could reasonably catch cases 
like this; please file a bug.

John.

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Objc-language mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/objc-language/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to