2024 Clojure 状态调查!中分享你的想法。

欢迎!请查看关于页面以获取有关如何操作的更多信息。

+1
编译器
已关闭

大家好 :)

今天早上遇到了我认为是编译器错误的bug,想知道我是否应该将其提交给JIRA?

以下是我认为是最小重复实例

(defprotocol P
  (^double p1 [p a])
  (^double p2 [p a]))

(let [p (reify P)]
  (min 0.0
       (case :p1
         :p1 (p1 p :foo)
         :p2 (p2 p :foo))))

错误

1. Caused by java.lang.ArrayIndexOutOfBoundsException
   Index -1 out of bounds for length 0

                Frame.java: 1262  clojure.asm.Frame/merge
                Frame.java: 1238  clojure.asm.Frame/merge
         MethodWriter.java: 1604  clojure.asm.MethodWriter/computeAllFrames
         MethodWriter.java: 1540  clojure.asm.MethodWriter/visitMaxs

...(我有更完整的跟踪信息可以发送,或者上面的代码片段应该在REPL中运行)

以下任何一项都可以消除此错误

  • 移除类型提示
  • 为case添加nil默认值
  • 将协议函数更改为正常的类型提示defn
  • case移出min(移除min

我已经成功重构了原始代码来解决这个问题,但请告诉我是否应该提交一个JIRA工单。

谢谢!

Weijun

已关闭备注:已在Clojure 1.12.0-beta1中修复

1 答案

+1

工单创建于 https://clojure.atlassian.net/browse/CLJ-2698

如有需要,请在那里评论。
谢谢!

...