On Oct 22, 2013, at 08:50, Sean McBride <[email protected]> wrote:
> On Tue, 22 Oct 2013 10:31:01 +0200, Daniel Höpfl said:
>
>>> Was the old (non-arc) code faulty (but the compiler did not notice
>>> this)?
>>> Why is the arc-version (with TRIGGER_ERROR defined) wrong?
>>
>> It is wrong in the non-arc world, too. (ISO/IEC 9899:2011 AKA C11,
>> 6.8.6.1: "A goto statement shall not jump from outside the scope of an
>> identifier having a variably modified type to inside the scope of that
>> identifier" - switch is a special case of goto.)
>
> Daniel,
>
> I don't think you can quote the Standard about 'goto' and just wave your
> hands and say it applies to 'switch' also. :) The Standard's description of
> 'switch' should contain the answer.
You are correct that that text doesn’t apply to switch statements. The closest
is:
6.8.4.2 2:
“If a switch statement has an associated case or default label within the scope
of an identifier with a variably modified type, the entire switch statement
shall be within the scope of that identifier"
> However, it does seem to me there is a clang bug here somewhere.
>
> I've made a shorter compilable example:
>
> ----------------------
> #import <Foundation/Foundation.h>
>
> int main (void)
> {
> int x = 0;
> switch(x)
> {
> case 1:
> x++;
> #if 0 // toggle me
> NSObject* foo = nil;
> #else
> int* foo = 0;
> #endif
> (void)foo;
> break;
>
> default:
> x++;
> };
>
> return 0;
> }
> ----------------------
>
> Then build with both:
> $ xcrun clang -fsyntax-only -Weverything test.m
> $ xcrun clang -fsyntax-only -Weverything -fobjc-arc test.m
>
> If 'foo' is int*, clang has no complaints in non-ARC and ARC.
>
> If 'foo' is NSObject*, clang has no complaints in non-ARC, but errors in ARC.
>
> IMHO, that's pretty weird!
The difference is that in non-ARC, both int* and NSObject* are allowed to be
uninitialized, so jumping over the initialization of foo isn’t an issue.
However, under ARC, object pointers must be initialized and cannot have an
indeterminate value (even if you don’t provide an initial value at the
definition, it is implicitly set to nil). It is not legal to jump over the
initialization in that case (in much the same way as in C++ it is not legal to
jump over the construction of a variable).
--
Clark Smith Cox III
[email protected]
_______________________________________________
Cocoa-dev mailing list ([email protected])
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com
This email sent to [email protected]