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 <a.stavo...@gmail.com> 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
> > Rust-dev@mozilla.org
> > https://mail.mozilla.org/listinfo/rust-dev
> 

> _______________________________________________
> Rust-dev mailing list
> Rust-dev@mozilla.org
> https://mail.mozilla.org/listinfo/rust-dev

_______________________________________________
Rust-dev mailing list
Rust-dev@mozilla.org
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to