Uploaded image for project: 'Clojure'
  1. CLJ-701

Primitive return type of loop and try is lost

    Details

    • Type: Bug
    • Status: Open
    • Priority: Major
    • Resolution: Unresolved
    • Affects versions: Backlog
    • Fix versions: Release 1.11
    • Labels:
      None
    • Environment:

      Clojure commit 9052ca1854b7b6202dba21fe2a45183a4534c501, version 1.3.0-master-SNAPSHOT

    • Approval:
      Incomplete
    • Patch:
      Code and Test

      Description

      (set! *warn-on-reflection* true)
      (fn [] (loop [b 0] (recur (loop [a 1] a))))
      

      Generates the following warnings:

      recur arg for primitive local: b is not matching primitive, had: Object, needed: long
      Auto-boxing loop arg: b
      

      This is interesting for several reasons. For one, if the arg to recur is a let form, there is no warning:

      (fn [] (loop [b 0] (recur (let [a 1] a))))
      

      Also, the compiler appears to understand the return type of loop forms just fine:

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

      The problem can of course be worked around using an explicit cast on the loop form:

      (fn [] (loop [b 0] (recur (long (loop [a 1] a)))))
      

      Reported by leafw in IRC: http://clojure-log.n01se.net/date/2011-01-03.html#10:31

      See Also: CLJ-1422 Open

      Patch: 0001-CLJ-701-add-HoistedMethod-to-the-compiler-for-hoisti-v2.patch

        Attachments

          Activity

            People

            • Assignee:
              Unassigned
              Reporter:
              chouser@n01se.net chouser
            • Votes:
              2 Vote for this issue
              Watchers:
              7 Start watching this issue

              Dates

              • Created:
                Updated: