Description
The following program is rejected:
mod sub {
fn prv() {}
pub use prv as renamed;
}
The restrictions which cause this rejection were introduced in rfc136.
I don't think the Reference currently states these restrictions explicitly anywhere.
The current text in visibility-and-privacy.md
gives the following basic rules:
Rust allows item accesses in two cases:
- If an item is public, then it can be accessed externally from some module
m
if you can access all the item's ancestor modules fromm
. You can also potentially be able to name the item through re-exports. See below.- If an item is private, it may be accessed by the current module and its descendants.
Then under "Re-exporting and Visibility" it says:
Rust allows publicly re-exporting items through a
pub use
directive. Because this is a public directive, this allows the item to be used in the current module through the rules above. It essentially allows public access into the re-exported item.
I think this is most naturally read as saying that the example above is accepted, and that renamed
can then be used outside sub
. In any case it can't be read as saying that the example's use
statement itself is rejected.
There's also the following text in use-declarations.md
:
A public
use
declaration can therefore redirect some public name to a different target definition: even a definition with a private canonical path, inside a different module
I think this indirectly implies the existence of the restrictions.