Bug 16075 – Compiler rejects basic mixin template

Status
RESOLVED
Resolution
INVALID
Severity
normal
Priority
P1
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2016-05-25T19:58:15Z
Last change time
2020-03-21T03:56:39Z
Assigned to
No Owner
Creator
Max Samukha

Comments

Comment #0 by maxsamukha — 2016-05-25T19:58:15Z
mixin template Foo(A...) { static if (A.length) { void foo(A[0] a) { } mixin Foo!(A[1..$]) F; alias foo = F.foo; } } mixin Foo!(int, string, bool); void main() { } Error: alias test.Foo!(int, string, bool).Foo!(string, bool).Foo!bool.foo recursive alias declaration The mixin should produce properly nested overload sets of foo: foo(int); foo(string); foo(bool); F.foo(string); F.foo(bool); F.F.foo(bool);
Comment #1 by b2.temp — 2016-05-25T21:23:11Z
(In reply to Max Samukha from comment #0) > mixin template Foo(A...) { > static if (A.length) { > void foo(A[0] a) { > } > > mixin Foo!(A[1..$]) F; > alias foo = F.foo; > } > } > > mixin Foo!(int, string, bool); > > void main() { > } > > Error: alias test.Foo!(int, string, bool).Foo!(string, bool).Foo!bool.foo > recursive alias declaration > > > The mixin should produce properly nested overload sets of foo: > > foo(int); foo(string); foo(bool); > F.foo(string); F.foo(bool); > F.F.foo(bool); Hi, there is an error in your code, the correct way to write your template is: mixin template Foo(A...) { static if (A.length) { void foo(A[0] a) {} static if (A.length > 1) // here !! { mixin Foo!(A[1..$]) F; alias foo = F.foo; } } } mixin Foo!(int,string,bool); void main() {} otherwise the instanciation continues endlessly with an empty A.
Comment #2 by maxsamukha — 2016-05-26T03:52:16Z
(In reply to b2.temp from comment #1) > > Hi, there is an error in your code, the correct way to write your template > is: > > > > mixin template Foo(A...) > { > static if (A.length) > { > void foo(A[0] a) {} > static if (A.length > 1) // here !! > { > mixin Foo!(A[1..$]) F; > alias foo = F.foo; > } > } > } > > mixin Foo!(int,string,bool); > > void main() {} > > > > otherwise the instanciation continues endlessly with an empty A. No. The base case is when A.length is zero. Remove the alias, and the example will compile.
Comment #3 by maxsamukha — 2016-05-26T04:07:54Z
Oops. You are right. In the original example, the wrong foo is aliased because the base case doesn't have one.