/*
RUN_OUTPUT:
---
Foo.~this()
Foo.~this()
Foo.~this()
Foo.~this()
A2.this()
Hello world.
A2.~this()
Success
---
*/

import core.stdc.stdio;

/******************************************/

class Foo
{
    static int x;

    ~this()
    {
        printf("Foo.~this()\n");
        x++;
    }
}

int test1x()
{
    scope Foo f = new Foo();
    return 6;
}


void test1()
{
    {
        scope Foo f = new Foo();
    }
    int c;

    assert(Foo.x == 1);
    c = test1x();
    assert(c == 6);
    assert(Foo.x == 2);

    if (c != 6)
        scope Foo h = new Foo();
    assert(Foo.x == 2);

    if (c == 6)
        scope Foo j = new Foo();
    assert(Foo.x == 3);

    {
        scope Foo g = null, k = new Foo();
        assert(Foo.x == 3);
    }
    assert(Foo.x == 4);
}

/******************************************/

int ax;

class A2
{
  this()
  {
    printf("A2.this()\n");
    ax += 1;
  }

  ~this()
  {
    printf("A2.~this()\n");
    ax += 1000;
  }
};


void test2()
{
  {
    scope A2 a = new A2();
    printf("Hello world.\n");
  }
  assert(ax == 1001);
}



/******************************************/

int status3;

class Parent3
{
}

class Child3 : Parent3
{
        this(){
                assert(status3==0);
                status3=1;
        }

        ~this(){
                assert(status3==1);
                status3=2;
        }
}

void foo3()
{
        scope Parent3 o = new Child3();
        assert(status3==1);
}

void test3()
{
        foo3();
        assert(status3==2);
}

/******************************************/

int main()
{
    test1();
    test2();
    test3();

    printf("Success\n");
    return 0;
}
