https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69850
--- Comment #13 from Markus Trippelsdorf <trippels at gcc dot gnu.org> --- template <typename T> struct A { static void release(T *p1) { p1->Release(); } }; template <typename T> class IntrusiveRefCntPtr { T Obj; public: void operator=(IntrusiveRefCntPtr) { A<T>::release(&Obj); } }; struct RopeRefCountString { void Release() { delete[] this; } }; struct RopePiece { IntrusiveRefCntPtr<RopeRefCountString> StrData; }; class RopePieceBTreeNode { protected: enum { WidthFactor }; }; class RopePieceBTreeLeaf : RopePieceBTreeNode { RopePiece Pieces[WidthFactor]; RopePieceBTreeNode *insert(const RopePiece &); }; int a; RopePieceBTreeNode *RopePieceBTreeLeaf::insert(const RopePiece &) { Pieces[a] = Pieces[1]; }