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.