/* Test out '@catch(id foo) {...}', which should catch
|
/* Test out '@catch(id foo) {...}', which should catch
|
all uncaught exceptions. */
|
all uncaught exceptions. */
|
/* Developed by Ziemowit Laski . */
|
/* Developed by Ziemowit Laski . */
|
|
|
/* { dg-options "-fobjc-exceptions" } */
|
/* { dg-options "-fobjc-exceptions" } */
|
/* { dg-do run } */
|
/* { dg-do run } */
|
|
|
#include
|
#include
|
#include
|
#include
|
#include
|
#include
|
|
|
/* The following is not required in actual user code; we include it
|
/* The following is not required in actual user code; we include it
|
here to check that the compiler generates an internal definition of
|
here to check that the compiler generates an internal definition of
|
_setjmp that is consistent with what provides. */
|
_setjmp that is consistent with what provides. */
|
#include
|
#include
|
|
|
#define CHECK_IF(expr) if(!(expr)) abort()
|
#define CHECK_IF(expr) if(!(expr)) abort()
|
|
|
@interface Frob: Object
|
@interface Frob: Object
|
@end
|
@end
|
|
|
@implementation Frob: Object
|
@implementation Frob: Object
|
@end
|
@end
|
|
|
static Frob* _connection = nil;
|
static Frob* _connection = nil;
|
|
|
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
|
|
|
|
void test (Object* sendPort)
|
void test (Object* sendPort)
|
{
|
{
|
int cleanupPorts = 1;
|
int cleanupPorts = 1;
|
Frob* receivePort = nil;
|
Frob* receivePort = nil;
|
|
|
@try {
|
@try {
|
printf ("receivePort = %p\n", receivePort);
|
printf ("receivePort = %p\n", receivePort);
|
printf ("sendPort = %p\n", sendPort);
|
printf ("sendPort = %p\n", sendPort);
|
printf ("cleanupPorts = %d\n", cleanupPorts);
|
printf ("cleanupPorts = %d\n", cleanupPorts);
|
printf ("---\n");
|
printf ("---\n");
|
|
|
receivePort = (Frob *) -1;
|
receivePort = (Frob *) -1;
|
_connection = (Frob *) -1;
|
_connection = (Frob *) -1;
|
printf ("receivePort = %p\n", receivePort);
|
printf ("receivePort = %p\n", receivePort);
|
printf ("sendPort = %p\n", sendPort);
|
printf ("sendPort = %p\n", sendPort);
|
printf ("cleanupPorts = %d\n", cleanupPorts);
|
printf ("cleanupPorts = %d\n", cleanupPorts);
|
printf ("---\n");
|
printf ("---\n");
|
|
|
receivePort = nil;
|
receivePort = nil;
|
sendPort = nil;
|
sendPort = nil;
|
cleanupPorts = 0;
|
cleanupPorts = 0;
|
|
|
printf ("receivePort = %p\n", receivePort);
|
printf ("receivePort = %p\n", receivePort);
|
printf ("sendPort = %p\n", sendPort);
|
printf ("sendPort = %p\n", sendPort);
|
printf ("cleanupPorts = %d\n", cleanupPorts);
|
printf ("cleanupPorts = %d\n", cleanupPorts);
|
printf ("---\n");
|
printf ("---\n");
|
|
|
@throw [Object new];
|
@throw [Object new];
|
}
|
}
|
@catch(Frob *obj) {
|
@catch(Frob *obj) {
|
printf ("Exception caught by incorrect handler!\n");
|
printf ("Exception caught by incorrect handler!\n");
|
CHECK_IF(0);
|
CHECK_IF(0);
|
}
|
}
|
@catch(id exc) {
|
@catch(id exc) {
|
printf ("Exception caught by correct handler.\n");
|
printf ("Exception caught by correct handler.\n");
|
printf ("receivePort = %p (expected 0x0)\n", receivePort);
|
printf ("receivePort = %p (expected 0x0)\n", receivePort);
|
printf ("sendPort = %p (expected 0x0)\n", sendPort);
|
printf ("sendPort = %p (expected 0x0)\n", sendPort);
|
printf ("cleanupPorts = %d (expected 0)\n", cleanupPorts);
|
printf ("cleanupPorts = %d (expected 0)\n", cleanupPorts);
|
printf ("---");
|
printf ("---");
|
CHECK_IF(!receivePort);
|
CHECK_IF(!receivePort);
|
CHECK_IF(!sendPort);
|
CHECK_IF(!sendPort);
|
CHECK_IF(!cleanupPorts);
|
CHECK_IF(!cleanupPorts);
|
}
|
}
|
}
|
}
|
|
|
int main (void) {
|
int main (void) {
|
test((Object *)-1);
|
test((Object *)-1);
|
return 0;
|
return 0;
|
}
|
}
|
|
|