// PR c++/52643 // { dg-options "-O" } template class already_AddRefd {}; template class ObjRef { public: ObjRef() {} ObjRef(const already_AddRefd aar) {} ~ObjRef() { T* mPtr; mPtr->release_ref(); } operator T* () const { return __null; } template void operator= (const already_AddRefd& newAssign) {} }; class MyRetClass { public: void release_ref(); }; class MyClass { void appendChild(); void getTripleOutOfByPredicate(); already_AddRefd getNextTriple(); }; void MyClass::getTripleOutOfByPredicate() { ObjRef t (getNextTriple()); if (t == __null) throw MyRetClass(); } void MyClass::appendChild() { while (1) { try { ObjRef t (getNextTriple()); continue; } catch (MyRetClass) { } } }