// https://issues.dlang.org/show_bug.cgi?id=15711 struct Quu { string val; } string[] result = foo!(0, [Quu(['z']), Quu("")]); template foo(size_t i, Quu[] data, string[] results = []) { static if (i < data.length) { enum def = data[i]; enum foo = foo!(i+1, data, results ~ def.val); } else { enum foo = results; } } // Run-time version already works string[] result_rt = foo_rt(0, [Quu(['z']), Quu("")]); string[] foo_rt(size_t i, Quu[] data, string[] results = []) { if (i < data.length) { auto def = data[i]; return foo_rt(i+1, data, results ~ def.val); } else { return results; } }