https://issues.dlang.org/show_bug.cgi?id=15039
Issue ID: 15039 Summary: Algebraic cannot store a Typedef along with Typedef'ed type Product: D Version: D2 Hardware: All OS: All Status: NEW Severity: normal Priority: P1 Component: phobos Assignee: nob...@puremagic.com Reporter: kolo...@bk.ru Reproducible with dmd v2.068.1 Test case: // -------------------- import std.variant; import std.typecons; alias IntTypedef = Typedef!int; alias Obj = Algebraic!(int, IntTypedef, This[]); void x(Obj obj) { obj.visit!( (int x) => {}, (IntTypedef x) => {}, (Obj[] x) => {}, ); } void main(){} // -------------------- Produces the following error: /usr/include/dmd/phobos/std/variant.d(2266,21): Error: static assert "overload for type 'This[]' hasn't been specified" /usr/include/dmd/phobos/std/variant.d(2010,54): instantiated from here: visitImpl!(true, VariantN!(16LU, int, Typedef!(int, 0, null), This[]), function (int x) => () { } , function (Typedef!(int, 0, null) x) => () { } , function (VariantN!(16LU, int, Typedef!(int, 0, null), This[])[] x) => () { } ) src/app.d(9,8): instantiated from here: visit!(VariantN!(16LU, int, Typedef!(int, 0, null), This[])) dmd failed with exit code 1. However the following code (just without Typedef) compiles just fine: // -------------------- import std.variant; import std.typecons; alias IntTypedef = Typedef!int; alias Obj = Algebraic!(int, This[]); void x(Obj obj) { obj.visit!( (int x) => {}, (Obj[] x) => {}, ); } void main(){} // -------------------- You can even have Algebraic!(int, int, This[]) without any problems. --