typeof(typename) fails silently

Sean Kelly sean at invisibleduck.org
Mon Sep 15 20:17:40 PDT 2008


Jarrett Billingsley wrote:
> On Mon, Sep 15, 2008 at 9:00 PM, Sean Kelly <sean at invisibleduck.org> wrote:
>> == Quote from Sean Kelly (sean at invisibleduck.org)'s article
> 
>>> Technically untrue.  An 'is' expression must contain a type.  ie. you
>>> can't do this:
>>>      is(5)
>>> That aside, the contents of an 'is' expression must still be valid D
>>> code, and typeof(int) is clearly no longer valid D code.  All I'm asking
>>> is to be told that my code is invalid.
>> Darnit, I take it back.  I suppose it's possible that the symbol passed to typeof
>> within an 'is' expression might be a type and it might be a value.  The 'is'
>> expression is just doing what it's supposed to.  What a pain :-)
> 
> Conversation Update kicked in halfway through my construction of just
> such an example ;)
> 
> (if you want to get _real_ technical: that's a syntactically invalid
> is() expression, and should give an error.  However the _contents_ of
> the is() expression may be syntactically valid, but _semantic_ errors
> simply cause it to evaluate to false (except in a few, buggy cases).
> And as you've realized, something like typeof(A) may only be
> semantically invalid, meaning that according to the semantics of is(),
> should make it evaluate false and not give an error.)

I'm of two minds on this.  The is expression already requires whatever 
it contains to be a type or there will be a compile-time error, but with 
the change to typeof we no longer have a bullet-proof way of ensuring 
that something is a type.  So either we use is(T) and hope T is a type 
or use is(typeof(T)) and hope T is not a type (because if T is a type 
then the condition will silently fail).  Neither is ideal, for obvious 
reasons.


Sean


More information about the Digitalmars-d-bugs mailing list