1/* { dg-do run } */ 2/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */ 3 4/* This tests that exceptions work. It used to fail because 5 objc_msgSend was marked with DECL_NOTHROW. 6 If you include objc/Object.h, the problem goes away, because 7 that file includes objc/objc-runtime.h which explicitly prototypes 8 objc_msgSend without 'nothrow'. */ 9 10#include <stdio.h> 11#include <stdlib.h> 12#include "../objc-obj-c++-shared/TestsuiteObject.m" 13 14// ObjectiveC class header 15@interface ObjCclass : TestsuiteObject { 16} 17-(void)method1; 18-(void)method2; 19@end 20 21// C++ class header 22class CPPclass { 23public: 24 void function1(); 25}; 26 27 28// Main 29int main(int argc, char *argv[]) 30{ 31 ObjCclass * foo = [[ObjCclass alloc] init]; 32 [foo method1]; 33 exit (0); 34} 35 36 37// ObjectiveC implementation 38@implementation ObjCclass 39 40-(void) method1 41{ 42 try { 43 [self method2]; 44 } 45 catch(...) { 46 return; 47 } 48} 49 50-(void) method2 51{ 52 CPPclass foo; 53 foo.function1(); 54} 55 56@end 57 58 59// C++ implementation 60void CPPclass::function1() 61{ 62 throw (1); 63 /* Shouldn't be here because we threw. */ 64 abort (); 65} 66 67