Bug 14666, can we prioritize ?

Kenji Hara via Digitalmars-d digitalmars-d at puremagic.com
Wed Jun 10 19:50:23 PDT 2015


On Wednesday, 10 June 2015 at 17:28:54 UTC, Walter Bright wrote:
> But also, dmd doesn't quite have a proper mechanism for 
> resolving forward references - it's a series of hacks, which is 
> why it's been such a source of bugs.
>
> The right way to do it is to go full lazy on running semantic() 
> on imported symbols. I did this with enums a while back, and 
> it's been working well.

Yes, I've continuously improved the hacky code in dmd, and 
finally it's almost completed to realize lazy semantic analysis.

List of current implementation details in dmd code:

- before than all, an imported symbol will be set its 'scope' for 
its lazy semantic analysis.
     Dsymbol::setScope()

- variable types are determined lazily, and it detects 'circular 
reference' in its initializer.
     v->semantic(v->scope); in DsymbolExp::semantic(), and etc
     v->inuse

- forward reference for functions and on-demand return type 
inference is done:
     FuncDeclaration::functionSemantic()
         Determine function signatures (parameter types and 
returnt types)
         If return type is inferred, it will invoke 
functionSemantic3().
     FuncDeclaration::functionSemantic3()
         Determine function full signature (includind deduced 
attributes and inferred return types)

- an alias for the symbols comes from instantiations will be 
resolve lazily
     AliasDeclaration::toAlias()

- an aggregate size (all of field variable types) is analyzed 
independently from other member semantic (member functions and so 
on)
     VarDeclaration::setFieldOffset()
     AggregateDeclaration::finalizeSize()

- tangled class template definitions is analyzed correctly.
     ClassDeclaration::baseok

- declarations in static if is lazily resolved
     StaticIfDeclaration::include()
         It will run addMembers() and setScope() for the members, 
after the condition is correctly evaluated.

- the types and symbols on UDA is lazily resolved
     UserAttributeDeclaration::getAttributes()
         It's called by __traits(getAttributes) to invoke 
on-demand semantic analysis.
     UserAttributeDeclaration::semantic2()
         UDA does not affect the semantic of annotated symbol, so 
it's normally deferred until semantic2() stage.

Anymore I cannot say they're just hacks.

While doing them, unfortunately I've introduced not a few numbers 
of regression issues, but they have been fixed properly.
Remaining issues in HEAD:

https://github.com/D-Programming-Language/dmd/pull/4731
https://github.com/D-Programming-Language/dmd/pull/4738

I'll be happy when you prioritize the PRs.

Kenji Hara


More information about the Digitalmars-d mailing list