[dmd-internals] Fixing forward ref bugs for good

Andrei Alexandrescu andrei at erdani.com
Thu Sep 15 08:56:40 PDT 2011


On 9/15/11 6:53 AM, Don Clugston wrote:
> On 15 September 2011 13:14,<mrmocool at gmx.de>  wrote:
>> Am 15.09.2011, 11:44 Uhr, schrieb Don Clugston<dclugston at googlemail.com>:
>>>
>>> I think there is a simple solution to 'static if'.
>>> Do const folding on every static if condition, giving a boolean result.
>>> Do NOT evaluate any static if bodies yet.
>>> This would have the same effect as if every 'static if' were evaluated
>>> simultaneously.
>>
>> What if the condition includes symbols from another static if's body or
>> mixin or whatever?
>
> I think that should be disallowed.

I see an issue here with cross-module use. For example, it's nice to have:

import some.module;

static if (is(typeof(some.module.foobar) == int)) {
    alias some.module.foobar baz;
} else {
    enum baz = 42; // or whatever
}

So far so good. The problem now is that some.module uses a similar 
technique to introduce that symbol foobar, the code won't work anymore.

I also realized that code relying on enumerating symbols in a module 
(like benchmark does) or a class (like an introspection library does) 
will miss all symbols guarded by static if. And, for example, ranges 
define plenty of those. This erodes the power of static if substantially.

I'm afraid it's back to the drawing board.


Andrei


More information about the dmd-internals mailing list