www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Another bug?

reply Jack Applegame <japplegame gmail.com> writes:
Code:

import std.stdio;
struct Foo {
     int val = 0;
         ~this() {
         writefln("destruct %s", val);
     }
}

void bar(ARGS...)() {
     ARGS args;
     args[0].val = 1;
     writefln("val = %s", args[0].val);
}

void main() {
     bar!Foo();
}

Excpected output:
val = 1
destruct 1

But got:
destruct 0
val = 1

It seems that the compiler destructs 'args' immediately after 
definition, not at the end of the function.
Jan 30 2017
next sibling parent Jack Applegame <japplegame gmail.com> writes:
WORKAROUND:

import std.stdio;

struct Foo {
     int val = 0;
     ~this() {
         writefln("destruct %s", val);
     }
}

void bar(ARGS...)() {
     struct Tuple {
         ARGS args;
         alias args this;
     }
     Tuple args;
     args[0].val = 1;
     writefln("val = %s", args[0].val);
}


void main() {
     bar!Foo();
}
Jan 30 2017
prev sibling parent reply ag0aep6g <anonymous example.com> writes:
On 01/30/2017 12:55 PM, Jack Applegame wrote:
 Code:

 import std.stdio;
 struct Foo {
     int val = 0;
         ~this() {
         writefln("destruct %s", val);
     }
 }

 void bar(ARGS...)() {
     ARGS args;
     args[0].val = 1;
     writefln("val = %s", args[0].val);
 }

 void main() {
     bar!Foo();
 }

 Excpected output:
 val = 1
 destruct 1

 But got:
 destruct 0
 val = 1

 It seems that the compiler destructs 'args' immediately after
 definition, not at the end of the function.
Yup, looks like a (pretty bad) bug to me.
Jan 30 2017
parent reply Jack Applegame <japplegame gmail.com> writes:
bug report: https://issues.dlang.org/show_bug.cgi?id=17128
Jan 30 2017
parent Yuxuan Shui <yshuiv7 gmail.com> writes:
On Monday, 30 January 2017 at 12:40:44 UTC, Jack Applegame wrote:
 bug report: https://issues.dlang.org/show_bug.cgi?id=17128
LDC (2.070.2) has a different problem: the dtor is never called.
Jan 30 2017