On Thursday, 25 July 2013 at 04:33:59 UTC, H. S. Teoh wrote:
From what I can tell from a cursory glance, it's caused by the
implementation of cartesianProduct using too many template expansions (esp. in the variadic version of cartesianProduct), causing DMD to run very slowly and eventually exhaust all available memory and crash.

Actually, it's probably caused by the exponential size of template symbol names thanks to mangling of eponymous templates:

int[] a, b, c, d;
writeln(typeof(cartesianProduct(a, b)).mangleof.length);
writeln(typeof(cartesianProduct(a, b, c)).mangleof.length);
writeln(typeof(cartesianProduct(a, b, c, d)).mangleof.length);

534
4025
25003

I can't even get it to compile with 5 params, but it's increasing by a factor of 6 or 7 each time, so 5 will be hundred of KB, 6 will be MBs and 7 will be 10s of MB.

This needs to be fixed. Simply compressing the names will not help, we need a better mangling scheme.

Reply via email to