Closed
Description
In this example:
trait Arr0 {
fn arr0_secret(&self);
}
trait TyParam {
fn ty_param_secret(&self);
}
mod m {
struct Priv;
impl ::Arr0 for [Priv; 0] { fn arr0_secret(&self) {} }
impl ::TyParam for Option<Priv> { fn ty_param_secret(&self) {} }
}
fn main() {
[].arr0_secret();
None.ty_param_secret();
}
[]
and None
are inferred to be values of private types [Priv; 0]
and Option<Priv>
.
(Some more examples can be found in https://internals.rust-lang.org/t/limits-of-type-inference-smartness/2919)
Privacy checker and "private-in-public" checker try hard to ensure the guarantee, that values of private types can't be obtained outside of their modules. If inferred types are checked for privacy, then this guarantee can actually be made strict.
One reason why this guarantee is useful, is because link time visibility is based on the language privacy, so it gives a way to reduce the number of methods visible from our libraries to outside.