OSDN Git Service

In gcc/objc/:
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / obj-c++.dg / try-catch-2.mm
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-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/Object1.h"
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: Object
22 @end
23
24 @implementation Frob: Object
25 @end
26
27 static Frob* _connection = nil;
28
29 //--------------------------------------------------------------------
30
31
32 void test (Object* 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 [Object 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
77 int main (void) {
78   test((Object *)-1);
79   return 0;
80 }
81 #include "../objc-obj-c++-shared/Object1-implementation.h"