Our discussion in a recent meeting concluded that statics will not be
allowed to contain types with destructors, and you also won't be able
to move out of static items:

https://github.com/mozilla/rust/issues/10577#issuecomment-32294407

On Tue, Jan 28, 2014 at 3:34 PM, Kevin Ballard <[email protected]> wrote:
> 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
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to