Hi,

testcase added, issue closed as fixed. Tested x86_64-linux.

Thanks,
Paolo.

////////////////////////
2012-10-14  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/52643
        * g++.dg/opt/pr52643.C: New.
Index: g++.dg/opt/pr52643.C
===================================================================
--- g++.dg/opt/pr52643.C        (revision 0)
+++ g++.dg/opt/pr52643.C        (working copy)
@@ -0,0 +1,64 @@
+// PR c++/52643
+// { dg-options "-O" }
+
+template<class T> class already_AddRefd {};
+
+template<class T>
+class ObjRef
+{
+public:
+  ObjRef() {}
+
+  ObjRef(const already_AddRefd<T> aar) {}
+
+  ~ObjRef()
+  {
+    T* mPtr;
+    mPtr->release_ref();
+  }
+
+  operator T* () const
+  {
+    return __null;
+  }
+
+  template<class U>
+  void operator= (const already_AddRefd<U>& newAssign) {}
+};
+
+class MyRetClass {
+public:
+  void release_ref();
+};
+
+class MyClass
+{
+  void appendChild();
+  void getTripleOutOfByPredicate();
+  already_AddRefd<MyRetClass> getNextTriple();
+};
+
+void
+MyClass::getTripleOutOfByPredicate()
+{
+  ObjRef<MyRetClass> t (getNextTriple());
+
+  if (t == __null)
+    throw MyRetClass();
+}
+
+void
+MyClass::appendChild()
+{
+  while (1)
+  {
+    try
+    {
+      ObjRef<MyRetClass> t (getNextTriple());
+      continue;
+    }
+    catch (MyRetClass)
+    {
+    }
+  }
+}

Reply via email to