Escaped scoped
Don
nospam at nospam.com
Mon Jan 4 11:33:24 PST 2010
Steven Schveighoffer wrote:
> On Mon, 04 Jan 2010 05:52:19 -0500, bearophile
> <bearophileHUGS at lycos.com> wrote:
>
>> If I compile the following code with DMD with and without the scope
>> annotation I can see that both versions compile and the version with
>> scope deletes the object. Is the compiler acting correctly here? I'd
>> like the compiler to refuse to compile this code when the scope
>> attribute is present (this is a reduced example from a bug I've just
>> removed from a program of mine):
>>
>> class Foo {}
>> class Bar {
>> Foo x;
>> void spam() {
>> scope Foo temp = new Foo();
>> this.x = temp;
>> }
>> }
>> void main() {}
>
> Scope is not a type constructor, so once the compiler passes the line
>
> scope Foo temp = new Foo();
>
> the compiler sees temp as type Foo, not scope Foo. So it is ignorant on
> the next line to know to stop you from doing something foolish.
I don't think that's true, actually. The compiler has a SCOPE storage
class internally. Not sure what it's used for, though.
> When using scope, it is on you to ensure that it doesn't escape.
Yes, I suspect it's impossible for the compiler to do perfect escape
analysis. But it probably wouldn't be difficult for it to do some.
> I think the compiler cheats a little bit on delegates, but it has severe
> limitations that I think make using delegates without accidentally
> allocating closures difficult.
It could probably catch simple cases like this one, though.
More information about the Digitalmars-d-learn
mailing list