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

David Chisnall csdavec at swan.ac.uk
Sat Apr 10 13:24:14 PDT 2010


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