C depends on a B which depends on A. One of B's features requires logic from one of A's features. If C only depends on Band not A then C won't compile unless Balso includes A's features in its own definition of the feature that C is including.
I would have intuitively expected cargo magic to know that anything depending on B's feature also requires A's feature. Of course, it can't, so B must be explicit, but it caught me and and some of my team members out :-).
That's really hard to follow so here is a repo demonstrating it.
tests = ["arbtest/derive",
# needs to export this because A/arbitrary is a compile time dependency otherwise `D` will fail
That's not an "export", you aren't exporting anything. That just means "the feature tests of this crate needs the feature tests of the a crate" and hence cargo automatically enables a's tests feature if b-needs-a's tests feature is enabled.
That kinda assumes you declare those dependencies. Not declaring you need a crate's feature is like not declaring this dependency. The ony difference is that cargo can only check this when you use b-needs-a's tests feature, while crate dependencies are always needed and hence always checked.