[cfe-commits] r75314 - in /cfe/trunk: include/clang/AST/ include/clang/Analysis/PathSensitive/ lib/AST/ lib/Analysis/ lib/CodeGen/ lib/Frontend/ lib/Sema/ test/CodeGenObjC/ test/PCH/ test/SemaObjC/ test/SemaObjCXX/
Fariborz Jahanian
fjahanian at apple.com
Thu Jul 23 09:44:37 PDT 2009
Addition of a category with protocol qualifier MyProtocol should not
imply that type of obj_c_cat_p
is now MyClass<MyProtocol>* IMO. Having said that, this is a corner
case. So please file a radar
and run it by the objc runtime group. We will deal with it as issue is
resolved.
- Fariborz
On Jul 23, 2009, at 9:00 AM, steve naroff wrote:
> Fariborz,
>
> I want to follow-up on an issue we discussed a week ago. See below...
>
> On Jul 13, 2009, at 5:14 PM, Fariborz Jahanian wrote:
>>>
>>>>>>
>>>>>> GCC warns...
>>>>>>
>>>>>> test/SemaObjC/comptypes-5.m:29: warning: assignment from
>>>>>> distinct Objective-C type
>>>>>> test/SemaObjC/comptypes-5.m:30: warning: assignment from
>>>>>> distinct Objective-C type
>>>>>>
>>>>>> I decided to allow it. Rationale: Both MyClass and MyOtherClass
>>>>>> implement MyProtocol. Since the protocols "match", and you can
>>>>>> assign any 'id' to an interface type (without warning), I
>>>>>> decided to allow it. I'm happy to put back the warning if
>>>>>> others feel strongly (Fariborz?).
>>>>>
>>>>> I'll let Fariborz make this call.
>>>>
>>>> We should probably put the warning back. Lack of a warning looks
>>>> like a clang bug. For example, clang (and gcc)
>>>> both issue warning here:
>>>>
>>>> @protocol MyProtocol
>>>> @end
>>>>
>>>> @interface MyClass
>>>> @end
>>>>
>>>> int main()
>>>> {
>>>> id <MyProtocol> obj_id_p;
>>>> MyClass *obj_c_cat_p;
>>>>
>>>> obj_c_cat_p = obj_id_p;
>>>> return 0;
>>>> }
>>>>
>>>> % $CLANGCC good.m
>>>> good.m:12:15: warning: incompatible type assigning
>>>> 'id<MyProtocol>', expected 'MyClass *'
>>>> obj_c_cat_p = obj_id_p;
>>>>
>>>> But if you add a category conforming to the protocol (as in the
>>>> test), then warning disappears in clang. Categories do not
>>>> enhance or change the type so behavior should not change.
>>>>
>>>
>>> Formally, I see your point (i.e. categories don't actually modify
>>> the type). Nevertheless, categories allow methods to be added to a
>>> class (a semantic that the compiler is very aware of). Since both
>>> categories and protocols are nothing more than "method
>>> containers", it seems like the compiler should be silent it
>>> determines the message can be sent. With dynamic typing and
>>> forwarding, all of this is speculative anyway:-) Just to be
>>> clear...I don't feel very strongly about this. I just think we
>>> should do what makes sense (and is in the spirit of the language).
>>> In this instance, I don't think GCC compatibility is a big issue...
>>
>> I agree your rational makes sense. But, let's not change this
>> behavior. Our users are unforgiving when we remove their favorite
>> warnings :).
>>
>
> Yesterday, I cleaned up code related to this issue. The cleanup
> ended up fixing a few issues that were clearly wrong (and in some
> cases were already noted in the tests).
>
> Now that the code has been "tightened up", I believe it's even more
> difficult to "bring back" this diagnostic above (related to SemaObjC/
> comptypes-5.m). ASTContext::ClassImplementsProtocol() clearly
> considers protocols on categories implemented by the class.
>
> Since I don't think there is a compelling case for a warning, I'm
> going to leave it as is (without a warning). From my perspective,
> the code is valid (and I believe GCC is incorrectly producing a
> warning).
>
> If you can come up with a clean way to bring back the warning, feel
> free. I've been fiddling with this and can't come up with an
> acceptable solution (without breaking valid code, which is bad:-).
>
> For reference, I've included the diff of the test case below...
>
> Thanks,
>
> snaroff
>
> [steve-naroffs-imac-3:tools/clang/test] snaroff% svn diff
> Index: SemaObjC/comptypes-5.m
> ===================================================================
> --- SemaObjC/comptypes-5.m (revision 76877)
> +++ SemaObjC/comptypes-5.m (working copy)
> @@ -26,8 +26,8 @@
> MyOtherClass<MyProtocol> *obj_c_super_p_q = nil;
> MyClass<MyProtocol> *obj_c_cat_p_q = nil;
>
> - obj_c_cat_p = obj_id_p;
> - obj_c_super_p = obj_id_p;
> + obj_c_cat_p = obj_id_p; // expected-warning {{incompatible type
> assigning 'id<MyProtocol>', expected 'MyClass *'}}
> + obj_c_super_p = obj_id_p; // expected-warning {{incompatible
> type assigning 'id<MyProtocol>', expected 'MyOtherClass *'}}
> obj_id_p = obj_c_cat_p; /* Ok */
> obj_id_p = obj_c_super_p; /* Ok */
>
>
>>>
>>>
>>> My 2$,
>>
>> My 2cents :).
>>
>> - fariborz
>>
>>
>
More information about the cfe-commits
mailing list