At first glance it seems reasonable to prohibit moving out of a mutable static, but I'm not sure it really makes sense to try and put restrictions on mutable statics when we can't make them safe.
-Kevin On Jan 28, 2014, at 3:26 PM, Niko Matsakis <[email protected]> wrote: > Probably this should yield an error -- I tend to think we should only > permit moves that we cannot enforce from `*` pointers, just to add an > extra barrier. > > > Niko > > On Tue, Jan 28, 2014 at 12:12:23PM -0800, Kevin Ballard wrote: >> Your code is moving the contents of Option<~MyStruct> into the match arm. It >> just so happens that this seems to be zeroing out the original pointer in >> memory, and that happens to be the same representation that None does for >> the type Option<~MyStruct> (since ~ pointers are non-nullable), so the act >> of moving the value just happens to be transforming it into a None. >> >> Normally you couldn't do this, but mutable statics are weird (which is why >> you need the unsafe block to access it). >> >> When you remove the ~, the lines end up printing the same because MyStruct >> is implicitly copyable, so your match arm is now copying instead of moving. >> >> The correct fix here is to use `Some(ref data)` instead of `Some(data)`. >> This will take a reference to the data instead of moving it, and the static >> will remain unchanged. >> >> -Kevin >> >> On Jan 28, 2014, at 11:48 AM, Alexander Stavonin <[email protected]> >> wrote: >> >>> Hi all! I’m not sure is it an error or "static mut" variables >>> misunderstanding from my side. The source: >>> >>> struct MyStruct { >>> val: int >>> } >>> >>> static mut global_data: Option<~MyStruct> = None; >>> >>> fn test_call() { >>> unsafe { >>> match global_data { >>> Some(data) => { println!("We have data {:?}", data);} >>> None => { println!("We don't have data");} >>> } >>> } >>> } >>> >>> fn main() { >>> >>> unsafe { >>> global_data = Some(~MyStruct{val: 42}); >>> } >>> >>> test_call(); >>> test_call(); >>> } >>> >>> and output: >>> >>> We have data ~MyStruct{val: 42} >>> We don't have data >>> >>> But if I’m changing global_data from Option<~MyStruct> to Option<MyStruct> >>> output is changed also: >>> >>> We have data ~MyStruct{val: 42} >>> We have data ~MyStruct{val: 42} >>> >>> Is it normal behaviour and owning pointers cannot be stored in global >>> variables or an error? >>> _______________________________________________ >>> Rust-dev mailing list >>> [email protected] >>> https://mail.mozilla.org/listinfo/rust-dev >> > >> _______________________________________________ >> Rust-dev mailing list >> [email protected] >> https://mail.mozilla.org/listinfo/rust-dev > _______________________________________________ Rust-dev mailing list [email protected] https://mail.mozilla.org/listinfo/rust-dev
