| // PERMUTE_ARGS: |
| |
| import core.stdc.stdio; |
| import core.stdc.stdlib; |
| |
| /*********************************************/ |
| |
| class Foo |
| { |
| static uint flags; |
| |
| new(size_t sz, int x) |
| { void* p; |
| |
| printf("Foo.new(sz = %d, x = %d)\n", sz, x); |
| assert(sz == Foo.classinfo.initializer.length); |
| assert(x == 5); |
| |
| p = core.stdc.stdlib.malloc(sz); |
| flags |= 4; |
| return p; |
| } |
| |
| this() |
| { |
| printf("this() %p\n", this); |
| a = 36; |
| } |
| |
| ~this() |
| { |
| printf("~this() %p\n", this); |
| a = -5; |
| flags |= 1; |
| } |
| |
| delete(void* p) |
| { |
| printf("delete %p\n", p); |
| free(p); |
| flags |= 2; |
| } |
| |
| int a = 3; |
| int b = 4; |
| int d = 56; |
| } |
| |
| void test1() |
| { |
| Foo f; |
| |
| f = new(5) Foo; |
| assert(f.a == 36); |
| assert(f.b == 4); |
| assert(f.d == 56); |
| assert(Foo.flags == 4); |
| |
| delete f; |
| assert(Foo.flags == 7); |
| } |
| |
| |
| /*********************************************/ |
| |
| struct Foo2 |
| { |
| static uint flags; |
| |
| new(size_t sz, int x) |
| { void* p; |
| |
| printf("Foo2.new(sz = %d, x = %d)\n", sz, x); |
| assert(sz == Foo2.sizeof); |
| assert(x == 5); |
| |
| p = core.stdc.stdlib.malloc(sz); |
| flags |= 4; |
| return p; |
| } |
| |
| delete(void *p) |
| { |
| printf("p = %p\n", p); |
| flags |= 2; |
| core.stdc.stdlib.free(p); |
| } |
| } |
| |
| void test2() |
| { |
| Foo2 *f = new(5) Foo2(); |
| |
| printf("f = %p\n", f); |
| delete f; |
| assert(Foo2.flags == 6); |
| } |
| |
| |
| /*********************************************/ |
| |
| int main() |
| { |
| test1(); |
| test2(); |
| |
| printf("Success\n"); |
| return 0; |
| } |
| |