Loops returning primtives are boxed even in return position

Description

Reported here: https://groups.google.com/d/topic/clojure/atoFzbyuyos/discussion

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 (defn first-bit? {:inline (fn [n] `(== 1 (clojure.lang.Numbers/and ~n, 1)) )} [^long n] (== 1 (clojure.lang.Numbers/and n, 1))) (defn exp-int ^double [^double x, ^long c] (loop [result 1.0, factor x, c c] (if (> c 0) (recur (if (first-bit? c) (* result factor) result), (* factor factor), (bit-shift-right c 1)) result)))

Last lines of the Java bytecode of `exp-int`:

1 2 3 4 5 59 dload 5; /* result */ 61 invokestatic 40; /* java.lang.Double java.lang.Double.valueOf(double c) */ 64 checkcast 85; /* java.lang.Number */ 67 invokevirtual 89; /* double doubleValue() */ 70 dreturn;

The compiler doesn't currently infer the primitive type as soon as there is a recur:

1 2 3 4 5 (use '[clojure.contrib.repl-utils :only [expression-info]]) (expression-info '(loop [a 1] a)) ;=> {:class long, :primitive? true} (expression-info '(loop [a 1] (if true a (recur a))) ;=> nil

Patch attached.

Environment

None

Status

Assignee

Christophe Grand

Reporter

Christophe Grand

Labels

None

Approval

Ok

Patch

Code

Fix versions

Affects versions

Release 1.4

Priority

Major