且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

尽管有尾调用位置,但堆栈溢出,但仅在64位中

更新时间:2023-12-04 16:30:10

看起来像编译器的序列表达式编译机制中的错误。以下是简化的复制形式:

Looks like a bug in the compiler's sequence expression compilation mechanism. Here's a simplified repro:

let rec loop r = seq {
    if r > 0 then
        let rec unused() = unused()
        yield r
        yield! loop r
}

printfn "%i" (Seq.nth 10000000 (loop 1))

显然,未使用的递归定义的存在不应该影响是否会产生堆栈溢出,但是会。

Obviously the presence of the unused recursive definition shouldn't affect whether this generates a stack overflow, but it does.