| // PERMUTE_ARGS: |
| |
| struct Field |
| { |
| this(this) @safe @nogc pure nothrow {} |
| } |
| |
| struct Counter |
| { |
| static size_t cnt; |
| this(this) @safe @nogc nothrow { ++cnt; } |
| } |
| |
| struct Foo |
| { |
| this(this) @safe @nogc pure nothrow {} |
| Field field; |
| } |
| |
| void test1() @safe @nogc pure nothrow |
| { |
| Foo foo; |
| foo.__xpostblit(); |
| } |
| |
| static assert(__traits(hasMember, Foo, "__xpostblit")); |
| |
| // |
| |
| struct FieldPostblit |
| { |
| Counter counter; |
| } |
| |
| struct AggrPostblit |
| { |
| static size_t cnt; |
| this(this) @safe @nogc nothrow { ++cnt; } |
| } |
| |
| struct MixedPostblit |
| { |
| static size_t cnt; |
| Counter counter; |
| this(this) @safe @nogc nothrow { ++cnt; } |
| } |
| |
| struct SNoPostblit {} |
| class CNoPostblit {} |
| |
| static assert(!__traits(hasMember, SNoPostblit, "__xpostblit")); |
| static assert(!__traits(hasMember, CNoPostblit, "__xpostblit")); |
| |
| void test2() @safe @nogc nothrow |
| { |
| FieldPostblit a; |
| assert(Counter.cnt == 0); |
| a.__xpostblit(); |
| assert(Counter.cnt == 1); |
| AggrPostblit b; |
| assert(AggrPostblit.cnt == 0); |
| b.__xpostblit(); |
| assert(AggrPostblit.cnt == 1); |
| Counter.cnt = 0; |
| MixedPostblit c; |
| assert(MixedPostblit.cnt == 0); |
| assert(Counter.cnt == 0); |
| c.__xpostblit(); |
| assert(MixedPostblit.cnt == 1); |
| assert(Counter.cnt == 1); |
| } |
| |
| void main() |
| { |
| test1(); |
| test2(); |
| } |