make use of deprecated namespaces/vars easier to spot


From the mailing list It is easy to use deprecated namespaces or vars without knowing you are doing so. The documentation warnings are small, and there is no compiler warning.


  • Add new warn-on-deprecated dynamic var, defaulted to false

  • Warn to stderr when {:deprecated true} namespace is loaded.

  • Warn to stderr when {:deprecated true} var is analyzed.

  • Warn to stderr when {:deprecated true} macro is expanded.

  • New system property clojure.compiler.warn-on-deprecated

  • Compile Clojure itself with clojure.compiler.warn-on-deprecated

  • Fix deprecation warnings inside Clojure (replicate, clear-agent-errors)

  • Mark clojure.parallel as deprecated with :deprecation tag


Patch: 706-deprecated-ns-var-warnings-tested-3.diff

Questions: Should default for deprecation warnings be true instead? People upgrading are likely to see new warnings which might be surprising.

  • Should default be to warn or not warn on deprecated?




Alex Miller
March 10, 2016, 4:54 PM
  • The if in the first change in core.clj should be a when instead.

  • Can namespace deprecation warning include more about where this is occurring?

  • I'm having a hard time reproducing the deprecated ns warning in a manual test (see below). There seems to be something weird about the binding+printf as the conditions appear to be satisfied. I'm thinking it has something to do with flushing err? Seems like (println "Warning: loading deprecated ns" lib) would be better there.

  • src/jvm/clojure/lang/ needs added support for clojure.compile.warn-on-deprecated RT flag

  • I think we should turn on warn-on-deprecated in the Clojure build itself (in build.xml)

  • If you do that, the following deprecation warnings exist in the Clojure build itself and we should fix those:

[java] Deprecation warning, clojure/core_proxy.clj:112:75 : var #'clojure.core/replicate is tagged as deprecated
[java] Deprecation warning, clojure/genclass.clj:149:41 : var #'clojure.core/replicate is tagged as deprecated
[java] Deprecation warning, clojure/genclass.clj:235:65 : var #'clojure.core/replicate is tagged as deprecated
[java] Deprecation warning, clojure/test/junit.clj:118:22 : var #'clojure.test/file-position is tagged as deprecated

  • Mark clojure.parallel as deprecated in the ns meta

Cezary Kosko
March 11, 2016, 11:40 AM

Uploaded a new diff addressing the comments & added warning on macroexpansion.

As far as the namespace deprecation warning goes, though, the code's only printing the current namespace, did not know whether there was a decent way to get a file/line combo.

Alex Miller
March 11, 2016, 2:53 PM

One more (hopefully final) round and then I think we're good:

  • The docstring for warn-on-deprecated should be updated now that we've expanded scope to cover ns too.

  • In the deprecated ns warning message, can we make it: "Deprecation warning: loading deprecated namespace `foo` from namespace `bar`."

  • In the macro and var warnings can we change "is tagged as deprecated" to just "is deprecated"?

  • Clean up the hanging parens in test/clojure/test_clojure/compilation/deprecated.clj

Thanks for the work on this!!

Alex Miller
March 11, 2016, 7:49 PM

Marking pre-screened for Rich to look at.

September 20, 2018, 10:32 AM

Comment made by: simongray

What happened to this feature? Is it still coming?


Cezary Kosko


Stuart Halloway





Code and Test