1/* Test out '@catch(id foo) {...}', which should catch
2   all uncaught exceptions.  */
3/* Developed by Ziemowit Laski <zlaski@apple.com>.  */
4
5/* { dg-do run } */
6/* { dg-xfail-run-if "PR23616" { *-*-* } { "-fgnu-runtime" } { "-fnext-runtime" } } */
7/* { dg-xfail-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" "-fgnu-runtime" } { "" } } */
8/* { dg-options "-fobjc-exceptions" } */
9
10#include "../objc-obj-c++-shared/TestsuiteObject.m"
11#include <stdio.h>
12#include <stdlib.h>
13
14/* The following is not required in actual user code; we include it
15   here to check that the compiler generates an internal definition of
16   _setjmp that is consistent with what <setjmp.h> provides.  */
17#include <setjmp.h>
18
19#define CHECK_IF(expr) if(!(expr)) abort()
20
21@interface Frob: TestsuiteObject
22@end
23
24@implementation Frob: TestsuiteObject
25@end
26
27static Frob* _connection = nil;
28
29//--------------------------------------------------------------------
30
31
32void test (TestsuiteObject* sendPort)
33{
34  int cleanupPorts = 1;
35  Frob* receivePort = nil;
36
37  @try {
38    printf ("receivePort = %p\n", receivePort);
39    printf ("sendPort = %p\n", sendPort);
40    printf ("cleanupPorts = %d\n", cleanupPorts);
41    printf ("---\n");
42
43    receivePort = (Frob *) -1;
44    _connection = (Frob *) -1;
45    printf ("receivePort = %p\n", receivePort);
46    printf ("sendPort = %p\n", sendPort);
47    printf ("cleanupPorts = %d\n", cleanupPorts);
48    printf ("---\n");
49
50    receivePort = nil;
51    sendPort = nil;
52    cleanupPorts = 0;
53
54    printf ("receivePort = %p\n", receivePort);
55    printf ("sendPort = %p\n", sendPort);
56    printf ("cleanupPorts = %d\n", cleanupPorts);
57    printf ("---\n");
58
59    @throw [TestsuiteObject new];
60  }
61  @catch(Frob *obj) {
62    printf ("Exception caught by incorrect handler!\n");
63    CHECK_IF(0);
64  }
65  @catch(id exc) {
66    printf ("Exception caught by correct handler.\n");
67    printf ("receivePort = %p (expected 0x0)\n", receivePort);
68    printf ("sendPort = %p (expected 0x0)\n", sendPort);
69    printf ("cleanupPorts = %d (expected 0)\n", cleanupPorts);
70    printf ("---");
71    CHECK_IF(!receivePort);
72    CHECK_IF(!sendPort);
73    CHECK_IF(!cleanupPorts);
74  }
75}
76
77int main (void) {
78  test((TestsuiteObject *)-1);
79  return 0;
80}
81
82