January 31, 2015 [Issue 14090] New: [REG2.067a] Incorrect "recursive alias declaration" | ||||
---|---|---|---|---|
| ||||
https://issues.dlang.org/show_bug.cgi?id=14090 Issue ID: 14090 Summary: [REG2.067a] Incorrect "recursive alias declaration" Product: D Version: D2 Hardware: All OS: All Status: NEW Keywords: rejects-valid Severity: regression Priority: P1 Component: DMD Assignee: nobody@puremagic.com Reporter: verylonglogin.reg@gmail.com This code used to compile: --- import std.algorithm: min, max; import std.range: StoppingPolicy; import std.traits; template Template(alias Pred, int argumentsCount, EnumType = void) if(argumentsCount >= -1) { static if(isSomeString!(typeof(Pred))) { template Template(Args...) if(argumentsCount == -1 || Args.length == argumentsCount) { static if(argumentsCount >= 1 && argumentsCount <= 2) { static if(__traits(compiles, { enum e = Args[0]; })) enum a = Args[0]; else static if(is(Args[0])) alias T = Args[0]; else alias A = Args[0]; static if(argumentsCount == 2) { static if(__traits(compiles, { enum e = Args[1]; })) enum b = Args[1]; else static if(is(Args[1])) alias U = Args[1]; else alias B = Args[1]; } } static if(is(EnumType == void)) { static if(__traits(compiles, { enum e = mixin(Pred); })) enum Template = mixin(Pred); else mixin(`alias Template = `~Pred~`;`); } else { enum EnumType Template = mixin(Pred); } } } else alias Template = Pred; } alias UnaryTemplate(alias Pred, EnumType = void) = Template!(Pred, 1, EnumType); alias GenericTuple(Args...) = Args; template PackedGenericTuple(Args...) { alias Tuple = Args; static if(isTypeTuple!Args) alias Types = Args; else static if(isExpressionTuple!Args) alias expressions = Args; enum length = Tuple.length; enum empty = !length; } template packedExpressionTuple(expr...) if(isExpressionTuple!expr) { alias packedExpressionTuple = PackedGenericTuple!expr; } template RoundRobinTuple(packedTuples...) { struct _Empty; enum pred(alias A) = !is(A == _Empty); alias ChainFunc(alias packedTuple) = packedTuple.Tuple; alias RoundRobinTuple = MapTuple!(ChainFunc, ZipTuple!(StoppingPolicy.longest, GenericTuple!_Empty, packedTuples)); } template ZipTuple(StoppingPolicy stoppingPolicy : StoppingPolicy.longest, alias empty, packedTuples...) { alias ZipTuple = ZipTupleImpl!(stoppingPolicy, PackedGenericTuple!empty, packedTuples); } template ZipTuple(StoppingPolicy stoppingPolicy : StoppingPolicy.longest, empty, packedTuples...) { alias ZipTuple = ZipTupleImpl!(stoppingPolicy, PackedGenericTuple!empty, packedTuples); } template ZipTuple(StoppingPolicy stoppingPolicy, packedTuples...) if(stoppingPolicy != StoppingPolicy.longest) // probably a compiler @@@BUG@@@ workaround { alias ZipTuple = ZipTupleImpl!(stoppingPolicy, PackedGenericTuple!void, packedTuples); } template ZipTuple(packedTuples...) { alias ZipTuple = ZipTuple!(StoppingPolicy.shortest, packedTuples); } private template ZipTupleImpl(StoppingPolicy stoppingPolicy, alias default_, packedTuples...) { alias lengths = MapTuple!(`A.length`, packedTuples); template Impl(size_t n, packedTuples...) { static if(n) { template tupleFrontOrDefault(alias packedTuple) { static if(!packedTuple.empty) alias tupleFrontOrDefault = packedTuple.Tuple[0 .. 1]; else alias tupleFrontOrDefault = default_.Tuple; } alias Impl = GenericTuple!(PackedGenericTuple!(MapTuple!(tupleFrontOrDefault, packedTuples)), Impl!(n - 1, MapTuple!(`PackedGenericTuple!(A.Tuple[!A.empty .. $])`, packedTuples))); } else alias Impl = GenericTuple!(); } static if(packedTuples.length == 1 || stoppingPolicy == StoppingPolicy.requireSameLength) enum length = lengths[0]; else enum length = GenericTuple!(min, max) [stoppingPolicy == StoppingPolicy.longest](lengths); alias ZipTupleImpl = Impl!(length, packedTuples); } template MapTuple(alias Func, A...) { alias FuncTemplate = UnaryTemplate!Func; static if (A.length) alias MapTuple = GenericTuple!(FuncTemplate!(A[0]), MapTuple!(FuncTemplate, A[1 .. $])); else alias MapTuple = GenericTuple!(); } void main() { alias roundRobin = RoundRobinTuple!(packedExpressionTuple!(1, 2, 3), packedExpressionTuple!(10, 20, 30, 40)); } --- main.d(60): instantiated from here: isExpressionTuple!(_Empty, 40) main.d(118): instantiated from here: PackedGenericTuple!(_Empty, 40) main.d(119): instantiated from here: Impl!(1u, __T18PackedGenericTupleZ, __T18PackedGenericTupleVii40Z) main.d(119): instantiated from here: Impl!(2u, __T18PackedGenericTupleVii3Z, __T18PackedGenericTupleVii30Vii40Z) main.d(119): instantiated from here: Impl!(3u, __T18PackedGenericTupleVii2Vii3Z, __T18PackedGenericTupleVii20Vii30Vii40Z) main.d(130): instantiated from here: Impl!(4u, __T18PackedGenericTupleVii1Vii2Vii3Z, __T18PackedGenericTupleVii10Vii20Vii30Vii40Z) main.d(89): instantiated from here: ZipTupleImpl!(cast(StoppingPolicy)1, __T18PackedGenericTupleTS4main121__T15RoundRobinTupleS434main36__T18PackedGenericTupleVii1Vii2Vii3ZS514main44__T18PackedGenericTupleVii10Vii20Vii30Vii40ZZ6_EmptyZ, __T18PackedGenericTupleVii1Vii2Vii3Z, __T18PackedGenericTupleVii10Vii20Vii30Vii40Z) main.d(79): instantiated from here: ZipTuple!(cast(StoppingPolicy)1, _Empty, __T18PackedGenericTupleVii1Vii2Vii3Z, __T18PackedGenericTupleVii10Vii20Vii30Vii40Z) main.d(146): instantiated from here: RoundRobinTuple!(__T18PackedGenericTupleVii1Vii2Vii3Z, __T18PackedGenericTupleVii10Vii20Vii30Vii40Z) --- Reduced from the same source (unstd.generictuple) as issue 13776. -- |
Copyright © 1999-2021 by the D Language Foundation