dip1000: why can't the addressee come into existence later?

Stanislav Blinov stanislav.blinov at gmail.com
Sat Nov 10 16:25:40 UTC 2018


On Saturday, 10 November 2018 at 06:56:29 UTC, Neia Neutuladh 
wrote:
> The following code doesn't work with @safe -dip1000:
>
>     int* p;
>     int i;
>     p = &i;
>
> i has a shorter lifetime than p, the compiler complains.
>
> But this code does:
>
>     int i;
>     int* p;
>     p = &i;
>
> The compiler does this even in the absence of scope guards and 
> destructors because simple, obvious rules will be easier to 
> understand and implement than nuanced ones, even if it makes 
> you reorder declarations sometimes.
>
> Is this right?

Yep, you just over-simplified the first case. Consider:

int* p;
{
     int i;
     p = &i;
}
*p = 42;

or even:

module thing;

int* global;

void foo() {
     int i;
     global = &i;
}

...much simpler to just go by the lifetime, instead of attempting 
to do a complex analysis. Because for the latter, it would then 
*need* to be deep to be of any use at all. Especially in a 
language that has static ifs:

// parameter is not scope, function is not pure, etc.
void nasty(int* p) { /* ... */ }

void main() {
     int *p;
     int i;
     p = &i;
     static if (someCondition) nasty(p);
}



More information about the Digitalmars-d-learn mailing list