[cfe-dev] [cfe-commits] r100942 - /cfe/trunk/lib/CodeGen/CGObjC.cpp

Chris Lattner clattner at apple.com
Sat Apr 10 14:41:32 PDT 2010


By your logic, we would accept cast of super... But we don't and it is  
intentional.  This is the same issue.

-Chris

On Apr 10, 2010, at 1:24 PM, David Chisnall <csdavec at swan.ac.uk> wrote:

> On 10 Apr 2010, at 21:09, Chris Lattner wrote:
>
>> On Apr 10, 2010, at 1:03 PM, David Chisnall wrote:
>>>>
>>>> The big issue here is that from a language perspective, "super"  
>>>> is not an expression at all.  It is a magic token that is only  
>>>> valid in a message send.  Things like super->ivar *should* be  
>>>> disallowed, as should "id x = super" and many other things that  
>>>> we probably accidentally allow.
>>>
>>> Currently, super->ivar is disallowed, so is id x = super.
>>
>> Good.
>>
>>> These are accepted by GCC, although that's probably not sensible.
>>
>> No, they aren't.
>
> They seem to be on my copy of GCC.  I just tested all of these and  
> they worked.
>
>>> [(super) foo];
>>
>> No, that should not be legal.  Super is not an expression.  It is  
>> not valid to use it in expression contexts: paren exprs require  
>> that the subexpression be an expression.
>>
>>> While you would never write this directly, it is relatively common  
>>> as a result of macro expansion, when a macro is used to optionally  
>>> remove message sends.  Consider a macro like this:
>>>
>>> #ifndef DISABLE_LOGS
>>> #define LOG(x) [(x) log]
>>> #else
>>> #define LOG(x)
>>> #endif
>>
>> Just because something is convenient doesn't mean it should be legal.
>
> The fact that something is convenient, supported by GCC, and used in  
> existing code seems like a good reason for accepting it...
>
>>> If you make a message send to super a flag in the AST, then how  
>>> would you represent [(super) foo] or [((super)) foo] in the AST?
>>
>> You wouldn't, we should reject this code, that's the whole point.
>
> I don't really see a convincing argument for rejecting it.  Even if  
> super is not an expression, being able to put it in brackets seems  
> logical because you use it in the same place as expressions.  If you  
> can put some message receivers in brackets and not others, this  
> makes the language inconsistent and makes macros even more  
> irritating to work with than the C spec normally does.
>
> And, if something can be used in the same place as an expression,  
> but isn't an expression, what is it?
>
> David
>
> -- Sent from my brain
>



More information about the cfe-dev mailing list