March 04, 2015
posted as bugzilla/14243. Am I misunderstanding something here?

On Tue, Mar 3, 2015 at 10:20 PM, Timothee Cour <thelastmammoth@gmail.com> wrote:

> Template mixin scope seems to have a weird behavior:
> I don't understand 'WEIRD(1)' and 'WEIRD(2)' below.
>
> import std.stdio;
> struct A{
>   int b;
>   this(int b){
>     this.b=b;
>     writeln("A.begin");
>   }
>   ~this(){
>     writeln("A.end");
>   }
> }
>
> mixin template Entry(){
>   auto a=A(12);
> }
>
> void test1(){
>   writeln("test.begin");
>   mixin Entry;
>   writeln(a.b);//WEIRD! destructor has been called but a.b is still alive
>   writeln("test.end");
> }
>
> void test2(){
>   writeln("test.begin");
>   auto a=A(0);
>   writeln("test.end");
> }
>
> void test3(){
>   writeln("test.begin");
>   mixin("auto a=A(0);");
>   writeln("test.end");
> }
>
> void main(){
>   test1;
>   writeln;
>   test2;
>   writeln;
>   test3;
> }
>
> output:
> ----------------
> test.begin
> A.begin
> A.end //WEIRD(1): why is destructor called before test.end?
> 12 //WEIRD(2): destructor has been called but a.b is still alive
> test.end
>
> test.begin
> A.begin
> test.end
> A.end
>
> test.begin
> A.begin
> test.end
> A.end
> ----------------
>