       expr)))
 
 (defn infer-type [env ast]
-  (if-let [tag (and (not (:tag ast))
-                    (infer-tag env ast))]
-    (assoc ast :tag tag)
-    ast))
+  (let [tag (:tag ast)]
+    (if (nil? tag)
+      (let [tag (infer-tag env ast)]
+        (if-not (nil? tag)
+          (assoc ast :tag tag)
+          ast))
+      ast)))
 
 (def ^:dynamic *passes* nil)
 

  {:op :constant :env env :form sym :tag 'cljs.core/Keyword})

(defn get-tag [e]
  (or (-> e :tag)
      (-> e :info :tag)
      (-> e :form meta :tag)))

(defn find-matching-method [f params]
  ;; if local fn, need to look in :info

        ret-tag (when-not (nil? (:fn-var info)) (:ret-tag info))]
    (if-not (nil? ret-tag)
      ret-tag
      (let [args (:args e)
            me (assoc (find-matching-method f args) :op :method)
            ret-tag (infer-tag env me)]
        (if-not (nil? ret-tag)
          ret-tag
          ANY_SYM)))))
