throw-nil.m: New test.
authorNicola Pero <nicola.pero@meta-innovation.com>
Wed, 8 Sep 2010 21:03:51 +0000 (21:03 +0000)
committerNicola Pero <nicola@gcc.gnu.org>
Wed, 8 Sep 2010 21:03:51 +0000 (21:03 +0000)
* objc/execute/exceptions/throw-nil.m: New test.
* objc/execute/exceptions/handler-1.m: Updated to use the new
objc_set_uncaught_exception_handler() function.
* objc/execute/exceptions/matcher-1.m: New test.

From-SVN: r164024

gcc/testsuite/ChangeLog
gcc/testsuite/objc/execute/exceptions/handler-1.m
gcc/testsuite/objc/execute/exceptions/matcher-1.m [new file with mode: 0644]
gcc/testsuite/objc/execute/exceptions/throw-nil.m [new file with mode: 0644]

index 8c649a2..5e014b1 100644 (file)
@@ -1,3 +1,10 @@
+2010-09-08  Nicola Pero  <nicola.pero@meta-innovation.com>
+
+       * objc/execute/exceptions/throw-nil.m: New test.
+       * objc/execute/exceptions/handler-1.m: Updated to use the new
+       objc_set_uncaught_exception_handler() function.
+       * objc/execute/exceptions/matcher-1.m: New test.
+       
 2010-09-08  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
 
        PR fortran/38282
index 684a831..ab2fe8c 100644 (file)
@@ -2,7 +2,9 @@
 /* Author: David Ayers */
 
 #ifdef __NEXT_RUNTIME__
-/* This test only runs for the GNU runtime. */
+/* This test only runs for the GNU runtime.  TODO: It should work on
+   the NEXT runtime as well (needs testing).
+ */
 
 int main(void)
 {
@@ -12,8 +14,8 @@ int main(void)
 #else
 
 #include <objc/objc-api.h>
+#include <objc/objc-exception.h>
 #include <objc/Object.h>
-#include <stdio.h>
 #include <stdlib.h>
 
 static unsigned int handlerExpected = 0;
@@ -31,7 +33,7 @@ my_exception_handler(id excp)
 int 
 main(int argc, char *argv[])
 {
-  _objc_unexpected_exception = my_exception_handler;
+  objc_setUncaughtExceptionHandler (my_exception_handler);
 
   @try
     {
diff --git a/gcc/testsuite/objc/execute/exceptions/matcher-1.m b/gcc/testsuite/objc/execute/exceptions/matcher-1.m
new file mode 100644 (file)
index 0000000..ef0b627
--- /dev/null
@@ -0,0 +1,68 @@
+/* Test custom exception matchers  */
+/* Author: Nicola Pero */
+
+#ifdef __NEXT_RUNTIME__
+/* This test only runs for the GNU runtime.  TODO: It should work on
+   the NEXT runtime as well (needs testing).
+ */
+
+int main(void)
+{
+  return 0;
+}
+
+#else
+
+#include <objc/objc-api.h>
+#include <objc/objc-exception.h>
+#include <objc/Object.h>
+#include <stdlib.h>
+
+static unsigned int handlerExpected = 0;
+
+void
+my_exception_matcher(Class match_class, id exception)
+{
+  /* Always matches.  */
+  return 1;
+}
+
+@interface A : Object
+@end
+
+@implementation A
+@end
+
+@interface B : Object
+@end
+
+@implementation B
+@end
+
+int 
+main(int argc, char *argv[])
+{
+  objc_setExceptionMatcher (my_exception_matcher);
+
+  @try
+    {
+      @throw [A new];
+    }
+  @catch (B *exception)
+    {
+      /* Since we installed an exception matcher that always matches,
+        the exception should be sent here even if it's of class A and
+        this is looking for exceptions of class B.
+       */
+      return 0;
+    }
+  @catch (id exception)
+    {
+      abort ();
+    }
+
+  abort ();
+}
+
+
+#endif
diff --git a/gcc/testsuite/objc/execute/exceptions/throw-nil.m b/gcc/testsuite/objc/execute/exceptions/throw-nil.m
new file mode 100644 (file)
index 0000000..3092d14
--- /dev/null
@@ -0,0 +1,38 @@
+#include <objc/objc.h>
+#include <objc/Object.h>
+
+/* Test throwing a nil exception.  A 'nil' exception can only be
+ * caugth by a generic exception handler.
+ */
+
+int main (void)
+{
+  int exception_catched = 0;
+  int finally_called = 0;
+
+  @try
+    {
+      @throw nil;
+    }
+  @catch (Object *exc)
+    {
+      abort ();
+    }
+  @catch (id exc)
+    {
+      exception_catched = 1;
+    }
+  @finally
+    {
+      finally_called = 1;
+    }
+
+
+  if (exception_catched != 1
+      || finally_called != 1)
+    {
+      abort ();
+    }
+
+  return 0;
+}