diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8c649a22ed9..5e014b18f9b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2010-09-08 Nicola Pero + + * 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 PR fortran/38282 diff --git a/gcc/testsuite/objc/execute/exceptions/handler-1.m b/gcc/testsuite/objc/execute/exceptions/handler-1.m index 684a8312b0b..ab2fe8c533e 100644 --- a/gcc/testsuite/objc/execute/exceptions/handler-1.m +++ b/gcc/testsuite/objc/execute/exceptions/handler-1.m @@ -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 +#include #include -#include #include 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 index 00000000000..ef0b627dab4 --- /dev/null +++ b/gcc/testsuite/objc/execute/exceptions/matcher-1.m @@ -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 +#include +#include +#include + +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 index 00000000000..3092d145170 --- /dev/null +++ b/gcc/testsuite/objc/execute/exceptions/throw-nil.m @@ -0,0 +1,38 @@ +#include +#include + +/* 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; +}