2008-05-30 Vladimir Makarov <vmakarov@redhat.com>
[official-gcc.git] / gcc / testsuite / obj-c++.dg / try-catch-9.mm
blobf79f52fbb9ac111c7cea329b54f7b94b8237ebd1
1 /* Check that local variables that get modified inside the @try
2    block survive until the @catch block is reached.  */
3 /* Developed by Ziemowit Laski <zlaski@apple.com>.  */
5 /* { dg-do run } */
6 /* { dg-xfail-if "PR23616" { *-*-* } { "*" } { "" } } */
7 /* { dg-prune-output ".*internal compiler error.*" } */
8 /* { dg-options "-fobjc-exceptions -O2" } */
10 #include <objc/Object.h>
11 #include <stdlib.h>
12 #include <stdio.h>
14 int gi1 = 9, gi2 = 19;
15 float gf1 = 9.0, gf2 = 19.0;
16 id obj2 = nil;
18 void foo (int arg1, float *arg2)
20   int *pi = &gi1;
21   float *pf = &gf1;
22   id obj1 = nil;
23   int local1 = 45, local2 = 47;
24   float local3 = 3.0, local4 = 4.0;
25   register int local5 = 15;
26   static float local6 = 16.0;
28   @try {
29     local1 = 123;
30     local2 = 345;
31     local3 = 5.0;
32     local4 = 6.0;
33     local5 = 17;
34     local6 = 18.0;
35     pi = &gi2;
36     pf = &gf2;
37     obj2 = obj1 = [Object new];
38     arg1 = 17;
39     arg2 = &gf2;
40     
41     @throw [Object new];
42   }
43   @catch (Object *obj) {
44    if (local1 != 123 || local2 != 345 || local3 != 5.0
45        || local4 != 6.0 || local5 != 17 || local6 != 18.0) {
46      printf("Abort 1\n");
47      abort();
48    }
49    if (pi != &gi2 || pf != &gf2) {
50      printf("Abort 2\n");
51      abort();
52    }
53    if (!obj1 || obj1 != obj2) {
54      printf("Abort 3\n");
55      abort();
56    }
57    if (arg1 != 17 || arg2 != &gf2) {
58      printf("Abort 4\n");
59      abort();
60    }
61   }
64 int main(void) {
65   foo(15, &gf1);
66   return 0;