// { dg-options "-fpreview=dip1008" } class E : Exception { static int instances; this(string msg = "") { super(msg); instances++; } ~this() { instances--; } } void main() { alias chain = Exception.chainTogether; assert(chain(null, null) is null); try { throw new E(); } catch (E e) { assert(E.instances == 1); assert(e.refcount == 2); } assert(E.instances == 0); try { throw new E(); } catch (E e) { assert(chain(null, e) is e); assert(e.refcount == 2); // "Owned by e" + 1 } assert(E.instances == 0); try { throw new E(); } catch (E e) { assert(chain(e, null) is e); assert(e.refcount == 2); // "Owned by e" + 1 } assert(E.instances == 0); try { throw new E("first"); } catch (E first) { try { throw new E("second"); } catch (E second) { try { throw new E("third"); } catch (E third) { assert(chain(first, second) is first); assert(first.next is second); assert(second.next is null); assert(chain(first, third) is first); assert(first.next is second); assert(second.next is third); assert(third.next is null); assert(first.refcount == 2); assert(second.refcount == 3); assert(third.refcount == 3); } } assert(E.instances == 3); } assert(E.instances == 0); }