On 12/30/2013 11:50 PM, Meta wrote:
enum factorial5=(function int(a)=>a==0?1:a*__traits(parent,{})(a-1))(5); (In D, you need to specify the return type for a recursive function declaration. If one doesn't here, DMD crashes, which is a bug. https://d.puremagic.com/issues/show_bug.cgi?id=11848)And of course I'm wrong about that as soon as I post. No idea why one works when the other doesn't...
AFAICT, none of the cases is supposed to work: https://d.puremagic.com/issues/show_bug.cgi?id=8307
Presumably it is the same bug that causes the segfault. The underlying cause might be a missing check for completion of return type inference. In the first case, this means that the return type of the function is null when it is encountered in the function body. When null is checked for compatibility with multiplication with an int, a null pointer dereference occurs. In the second case, the return type has been partly resolved to 'int' as the first return statement has been analyzed to completion before the function call is encountered.
