https://issues.dlang.org/show_bug.cgi?id=7347

RazvanN <razvan.nitu1...@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
                 CC|                            |razvan.nitu1...@gmail.com
         Resolution|---                         |WORKSFORME

--- Comment #1 from RazvanN <razvan.nitu1...@gmail.com> ---
(In reply to Denis Shelomovskii from comment #0)
> ---
> import std.stdio;
> 
> class C {
>     int n;
>     this(int n) { writefln(" this(%s) at %s", this.n = n, cast(void*)this); }
>     ~this() { writefln("~this(%s) at %s", n, cast(void*)this); }
> }
> 
> void main() {
>     int i;
>     writefln("Stack is at %s", &i);
>     writefln("Heap  is at %s", (new void[1]).ptr);
>     {
>         C cHeap = new C(0); // will be destroyed on scope exit
>         scope C c0 = cHeap;
> 
>         // C(1)-C(4) will be allocated in heap
>         // C(1), C(2), and C(4) will be destroyed on scope exit
>         // C(3) will be destroyed on garbage collection
>         scope C c1 = cast(C)cast(void*)new C(1);
>         scope C c2 = true ? new C(2) : null;
>         scope C c3 = (new C(3), new C(4));
>     }
>     writefln("after scope");
> }
> ---
> As a result even if `C` is a `scope class` the program will compile without
> `cHeap` and `c0`, but every `C` instance will be allocated in heap and C(3)
> will be destroyed on garbage collection.

The code now allocates C(0) and C(1) on the heap and C(2) on the stack. I could
not test C(3) and C(4) since comma expressions are no longer supported. I think
that this behavior is fine since a scope class does not necessarily mean that
it will be allocated on the stack. The spec specifically tells "When a class is
constructed with new and assigned to a local scope variable, it may be
allocated on the stack and permitted in a @nogc context." [1]. Since the
compiler does not do any dataflow analysis, it is hard to understand whether
rhs directly calls new or it does other shenanigans (like the casts in the c1
initialization).

Therefore, I think that this bug report is invalid at this point. 

[1] https://dlang.org/spec/attribute.html#scope-class-var

--

Reply via email to