         ;; handles argument in the *outer* scope where the function is defined,
         ;; *NOT* in the inner scope that the function defines (see :function for that)
         (&m (&into [:argument id] (&C type) (&C default)))
+        [[:return a]] (&m (&tag :return (&C a)))
         [[:function args return-type body]]
         (&m (&let [args (&Cargs args) ; handle type and default
                    return-type (&C return-type)]

    :else `(~'if ~test ~then ~else)))

(defn sort-effects [fx]
  {:pre [(do (DBG :sort-effects fx) true)]
   :post [(do (DBG :sort-effects=> %) true)]}
  (concat (filter (let [e (:effects fx)] #(get e %)) [:return :raise :break :continue :yield])
          (sort (map first (filter second (:vars fx))))))


  ;;   IF there are no escaping bindings in the test, THEN we can use cond,
  ;;   and merge with the other things with cond-conj
  (fn [E]
    ;;(DBG :&Ccond test-thens else meta E)
    (let [effects-that-matter-after-cond
          ;; merge local result from continuation-analysis with accumulated context
          (ka/env-both (get meta :capturing) (get E :capturing))
