[dmd-internals] Fixing forward ref bugs for good

Rainer Schuetze r.sagitario at gmx.de
Wed Sep 14 00:06:39 PDT 2011


On 14.09.2011 00:04, Walter Bright wrote:
> Don, just so you know, I've been thinking for a while about 
> transitioning from doing the semantic pass in order to doing it 
> completely "on demand". In other words, try to semantic a declaration. 
> In the process, any declarations it depends on are semantic'd if not 
> already, recursively.

I've been trying something similar for Visual D in its yet to integrate 
semantic analysis for intellisense. Still, static if and mixins get in 
the way of complete "on demand" handling. When a symbol is searched in a 
scope (e.g. a module, class, struct), some preparational work has to be 
done before the member list can be searched:

1. all "simple" non-scoping members are expanded (version/debug 
conditions, attributed declaration blocks). the branch inserted to the 
scopes' member list is also searched for "simple" non-scoping members 
(this step could also be done non-lazily, but doing it lazily slightly 
changes the interaction of version statements and conditionals with 
"static if" conditionals - good or bad, I don't know)

2. "complex" non-scoping members are expanded in lexical order (static 
if, mixins). When inserting the expanded branch into the scopes member 
list, the expansion restarts at 1.

This works out better than the current dmd implementation, e.g. when 
forward referencing symbols in a mixin. There are still situations that 
depend on interpretation order, but that is to be expected when "static 
if" is used.

It might be good to define the lookup mechanism, so it would be possible 
to determine whether a failing forward reference is beyond expected 
behaviour rather than a compiler-implementation detail.



More information about the dmd-internals mailing list