xref: /llvm-project/clang/test/Rewriter/rewrite-modern-throw.m (revision 0f1c1be1968076d6f96f8a7bcc4a15cf195ecd97)
1// RUN: %clang_cc1 -x objective-c -Wno-return-type -fblocks -fms-extensions -rewrite-objc %s -o %t-rw.cpp
2// RUN: %clang_cc1 -fsyntax-only -std=gnu++98 -fcxx-exceptions -fexceptions  -Wno-address-of-temporary -D"SEL=void*" -D"__declspec(X)=" %t-rw.cpp
3
4typedef struct objc_class *Class;
5typedef struct objc_object {
6    Class isa;
7} *id;
8
9void *sel_registerName(const char *);
10
11@interface Foo @end
12void TRY(void);
13void SPLATCH(void);
14void MYTRY(void);
15void MYCATCH(void);
16
17void foo(void) {
18  @try  { TRY(); }
19  @catch (...) { SPLATCH(); @throw; }
20}
21
22int main(void)
23{
24
25  @try  {
26     MYTRY();
27  }
28
29  @catch (Foo* localException) {
30     MYCATCH();
31     @throw localException;
32  }
33
34  // no catch clause
35  @try { }
36  @finally { }
37}
38
39
40@interface INST
41{
42  INST* throw_val;
43}
44
45- (id) ThrowThis;
46
47- (void) MainMeth;
48
49@end
50
51
52@implementation INST
53- (id) ThrowThis { return 0; }
54
55- (void) MainMeth {
56  @try  {
57     MYTRY();
58  }
59  @catch (Foo* localException) {
60     MYCATCH();
61     @throw [self ThrowThis];
62  }
63  @catch (...) {
64    @throw [throw_val ThrowThis];
65  }
66}
67@end
68
69@class NSDictionary, NSException;
70@class NSMutableDictionary;
71
72@interface NSString
73+ (id)stringWithFormat:(NSString *)format, ... ;
74@end
75
76@interface  NSException
77+ (NSException *)exceptionWithName:(NSString *)name reason:(NSString *)reason userInfo:(NSDictionary *)userInfo;
78@end
79id *_imp__NSInvalidArgumentException;
80
81@interface NSSetExpression @end
82
83@implementation NSSetExpression
84-(id)expressionValueWithObject:(id)object context:(NSMutableDictionary*)bindings {
85    id leftSet;
86    id rightSet;
87    @throw [NSException exceptionWithName: *_imp__NSInvalidArgumentException reason: [NSString stringWithFormat: @"Can't evaluate set expression; left subexpression not a set (lhs = %@ rhs = %@)", leftSet, rightSet] userInfo: 0];
88
89    return leftSet ;
90}
91@end
92
93