Thread overview
Assigning a scope variable to an outer-scope variable is allowed?
Jul 04, 2007
Gregor Richards
Jul 08, 2007
Leonard Dahlmann
July 04, 2007
Hello. I have a question about "scope" variables.

I've understood that it is not allowed to copy a scope variable or a scope parameter to outside of the scope. But, the following code compiles without any warnings or errors, and of course, causes a runtime error.

Is this just a bug?

//----

class C {
    ~this() { writefln("dtor"); }
    void func() { }
}
void main() {
    C a;
    {   scope C b = new C;
        a = b;
    } // dtor
    if(a !is null) a.func(); // Error: Access Violation
}

const(int[]) g;
void foo(in int[] a) { // in == final const scope
    g = a;  // a is scope?
}
July 04, 2007
のしいか (noshiika) wrote:
> Hello. I have a question about "scope" variables.
> 
> I've understood that it is not allowed to copy a scope variable or a scope parameter to outside of the scope. But, the following code compiles without any warnings or errors, and of course, causes a runtime error.
> 
> Is this just a bug?
> 
> //----
> 
> class C {
>     ~this() { writefln("dtor"); }
>     void func() { }
> }
> void main() {
>     C a;
>     {   scope C b = new C;
>         a = b;
>     } // dtor
>     if(a !is null) a.func(); // Error: Access Violation
> }
> 
> const(int[]) g;
> void foo(in int[] a) { // in == final const scope
>     g = a;  // a is scope?
> }

Assigning a scope object to a variable which is not in that scope is valid, it's just usually stupid. One use where it's necessary (though a bit unclean) is if you have a global variable which you want to temporarily set to a scope object. You set it at the beginning of your scope, then reset it at the end, so it's never referring to an invalid object.

That is to say: You're right, that's not allowed. But it's not allowed due to it being impossible at /runtime/, not any problems at /compile/ time. And adding a warning would make legit uses a PITA.

 - Gregor Richards
July 08, 2007
Gregor Richards wrote:
>> const(int[]) g;
>> void foo(in int[] a) { // in == final const scope
>>     g = a;  // a is scope?
>> }
> 
> Assigning a scope object to a variable which is not in that scope is valid, it's just usually stupid. One use where it's necessary (though a bit unclean) is if you have a global variable which you want to temporarily set to a scope object. You set it at the beginning of your scope, then reset it at the end, so it's never referring to an invalid object.
> 
> That is to say: You're right, that's not allowed. But it's not allowed due to it being impossible at /runtime/, not any problems at /compile/ time. And adding a warning would make legit uses a PITA.
> 

Well, then isn't it inconsistent with what Walter said before?


news://news.digitalmars.com:119/f2iism$tco$1@digitalmars.com
Walter Bright wrote:
> scope - the function will not keep a reference to the parameter's data
> that will persist beyond the scope of the function
>
> For example:
> int[] g;
>
> void foo(in int[] a)
> {
>     a = [1,2];    // error, a is final
>     a[1] = 2;   // error, a is const
>     g = a;    // error, a is scope
> }
July 08, 2007
This just isn't implemented yet.

���� (noshiika) Wrote:
> Well, then isn't it inconsistent with what Walter said before?