                         (:methods init-expr))})))
       (merge {:env env :op :def :form form
               :name name :var var-expr :doc doc :init init-expr}
-             (when tag {:tag tag})
-             (when dynamic {:dynamic true})
-             (when export-as {:export export-as})
-             (when init-expr {:children [init-expr]})))))
+        (when tag
+          (if fn-var?
+            {:ret-tag tag}
+            {:tag tag}))
+        (when dynamic {:dynamic true})
+        (when export-as {:export export-as})
+        (when init-expr {:children [init-expr]})))))
 
 (defn- analyze-fn-method [env locals form type]
   (let [param-names (first form)

    tag
    (case (:op e)
      :recur 'ignore
      :let (infer-tag env (:expr e))
      :loop (infer-tag env (:expr e))
      :do  (infer-tag env (:ret e))
      :method (infer-tag env (:expr e))
      :def (infer-tag env (:init e))
      :invoke  (let [f (:f e)]
                 (or (and (-> f :info :fn-var) (:tag f))
                     (infer-tag env
                       (assoc (find-matching-method f (:args e)) :op :method))
                     'any))

                  (let [be {:name   n
                            :line (get-line n env)
                            :column (get-col n env)
                            :ret-tag (-> n meta :tag)
                            :local  true
                            :shadow (locals n)}]
                    [(assoc-in env [:locals n] be)
