a) In the so-called "whole dtor" which calls the dtors of all
members including the dtor declared (if any). The attributes of
the "whole dtor" are deduced.
b) Everything takes place in the dtor declared (if any). If the
dtor is pure/nothrow/safe, it is guaranteed that the object can
be destructed purely/without throwing/safely. This will break
existing code.
-----
struct S { ~this() { } }
struct SX { S s; pure ~this() { } }
-----
a) Compiles.
b) Error: S.s.~this is impure
Both behaviors are available on github:
a) https://github.com/D-Programming-Language/dmd/pull/2006
b) https://github.com/D-Programming-Language/dmd/pull/2003
You can apply this to postblit, too.