uh, anyone remembers a proposal along the lines of:
pub struct Foo {
a: Bar,
pub b: Baz,
}
impl ?Uninit for Foo {}
fn partially_init_foo(foo: &mut Foo(!a) -> Foo(a)) {
foo.a = something;
}
fn partially_uninit_foo(foo: &mut Foo(a) -> Foo(!a)) {
drop(foo.a);
}
fn those_bangs_can_be_inferred(foo: &mut Foo(!a) -> Foo(a)) {
foo.a = something;
}
//pub fn no_private_in_public(foo: &mut Foo(a) -> Foo(!a)) { drop(foo.a) } // ERROR: no private in public
pub fn partially_init_public(foo: &mut Foo() -> Foo(b)) {
foo.b = something;
//foo.a // ERROR: a may be uninitialized
}
pub fn init_everything(foo: &mut Foo() -> Foo) {
foo.a = something;
foo.b = something_else;
}
//impl Drop for Foo(a) {...} // ERROR: no private in public
impl Drop for Foo(b) {
fn drop(&mut self) {
// perfectly safe
}
}
let x = std::mem::uninitialized::<Foo()>(); // safe
//let x = std::mem::uninitialized::<Foo>(); // ERROR: unsafe
let x = unsafe { std::mem::uninitialized::<Foo>() }; // UB