Rust generally follows the strategy of providing all the errors and warnings it can, so that you can fix all of them in one pass without having to re-run the compiler to see more errors. I personally love the way Rust warns about everything unused, including things used by code that is itself unused. A complete list of what isn't used helps if you're going to delete them (you know everything to delete), and it gives you a menu of things to start using if you're adding code. Rust can't assume that there's a "top-level function" you want to call; perhaps you need to add calls to several things and delete others as unused.
Regarding deprecated things, however, that does seem a little different. Sometimes you would want to migrate the internals of deprecated functions to use a different non-deprecated implementation, but other times it could indeed make sense to say "deprecated except for use by other deprecated things". I don't know that that's a choice you'd want to make at a crate level; rather, I like the idea of having a "deprecated outside this crate" concept:
This seems reasonable to me:
deprecated(pub) could deprecate uses from outside the crate, and perhaps
deprecated(pub(crate)) could deprecate uses outside the module.