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 -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();
13void SPLATCH();
14void MYTRY();
15void MYCATCH();
16
17void foo() {
18  @try  { TRY(); }
19  @catch (...) { SPLATCH(); @throw; }
20}
21
22int main()
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// rdar://13186010
70@class NSDictionary, NSException;
71@class NSMutableDictionary;
72
73@interface NSString
74+ (id)stringWithFormat:(NSString *)format, ... ;
75@end
76
77@interface  NSException
78+ (NSException *)exceptionWithName:(NSString *)name reason:(NSString *)reason userInfo:(NSDictionary *)userInfo;
79@end
80id *_imp__NSInvalidArgumentException;
81
82@interface NSSetExpression @end
83
84@implementation NSSetExpression
85-(id)expressionValueWithObject:(id)object context:(NSMutableDictionary*)bindings {
86    id leftSet;
87    id rightSet;
88    @throw [NSException exceptionWithName: *_imp__NSInvalidArgumentException reason: [NSString stringWithFormat: @"Can't evaluate set expression; left subexpression not a set (lhs = %@ rhs = %@)", leftSet, rightSet] userInfo: 0];
89
90    return leftSet ;
91}
92@end
93
94