Bug 16061 – [Reg 2.071.1-b1] dot template instance of imported template fails as overloadset

Status
RESOLVED
Resolution
INVALID
Severity
regression
Priority
P1
Component
dmd
Product
D
Version
D2
Platform
x86_64
OS
Linux
Creation time
2016-05-23T01:29:00Z
Last change time
2016-09-13T04:50:38Z
Assigned to
code
Creator
puneet

Comments

Comment #0 by puneet — 2016-05-23T01:29:33Z
$ dmd -c foo.d Fails with 2.071.1-b1 with error: bar.d(3): Error: T.Zoo is not a template, it is a overloadset bar.d(8): Error: template instance bar.Boo!(Foo) error instantiating foo.d(3): Error: mixin foo.Foo.Bar!() error instantiating // file foo.d class Foo { import bar; mixin Bar; } // file bar.d class Zoo(V) {} template Boo(T) { alias Boo = T.Zoo!T; } mixin template Bar() { class Zoo(V) {} alias U = typeof(this); alias BooThis = Boo!U; }
Comment #1 by code — 2016-09-13T04:50:38Z
The behavior is correct and intended. Also matches pre-2.071.0 behavior. It's an overloadset of import bar.Zoo and mixin Bar!().Zoo. The 2-phase lookup for local vs. imported symbols is only done for unqualified lookups, but T.Zoo!T is qualified so it also finds the imported template. This was wrongly implemented in 2.071.1-b1 (only searched locals), but got fixed here https://github.com/dlang/dmd/pull/5651/files#diff-ddbaa5e9ca3d5c90a425a9dfafaf1734R1123, by not enforcing SearchLocalsOnly if no flags was provided.