[cfe-dev] Comparison of pointers between Objc subclasses
Ted Kremenek
kremenek at apple.com
Tue Jul 1 16:22:32 PDT 2008
On Jul 1, 2008, at 3:40 PM, Eli Friedman wrote:
> On Tue, Jul 1, 2008 at 2:33 PM, Thomas Clement <thomascl at free.fr>
> wrote:
>> I noticed that clang (-fsyntax-only) produces the following warning:
>>
>> MyClass.m:15:11: warning: comparison of distinct pointer types
>> ('NSMutableArray *' and 'NSArray *')
>> if (array != newArray)
>> ~~~~~ ^ ~~~~~~~~
>>
>> Since NSMutableArray is a subclass of NSArray, the warning doesn't
>> seem really appropriate.
>
> Probably caused by the fact that ASTContext::typesAreCompatible isn't
> commutative for ObjC types; clang currently considers (Base, Derived)
> to be compatible, while (Derived, Base) isn't. I actually have a
> patch that will fix that, but I'm not sure about some of the
> expectations for type compatibility and ObjC.
>
> Considering two ObjC pointers compatible in the C99 sense makes a lot
> of things legal which probably shouldn't be legal: for example,
> redeclaring a pointer to a base type as a pointer to a derived type is
> legal (illegal in C++), assigning a base type pointer to a derived
> type pointer is legal (requires a static_cast in C++), and assigning a
> pointer to a derived type pointer to a pointer to a base type pointer
> is legal (requires a reinterpret_cast in C++). Because of situations
> like these, C++ doesn't have type compatibility in the same sense;
> legal combinations of operands are defined on a case-by-case basis.
> What exactly are the rules supposed to be for ObjC? (Or, if the rules
> aren't written down anywhere, what does gcc do?)
Are pointer type compatibility checks for assignments and conversions
being handled in the same way? I can understand why assigning a base
type to a derived type is dangerous, but it seems to me that
comparisons like these should be legal. I'm only raising this point
because the code snippet with the warning involved a comparison, not
an assignment.
More information about the cfe-dev
mailing list