// RUN: %clang_cc1 -x objective-c -Wno-return-type -fblocks -fms-extensions -rewrite-objc %s -o %t-rw.cpp
// RUN: %clang_cc1 -fsyntax-only -fcxx-exceptions -fexceptions  -Wno-address-of-temporary -D"SEL=void*" -D"__declspec(X)=" %t-rw.cpp

typedef struct objc_class *Class;
typedef struct objc_object {
    Class isa;
} *id;

void *sel_registerName(const char *);

@interface Foo @end
void TRY();
void SPLATCH();
void MYTRY();
void MYCATCH();

void foo() {
  @try  { TRY(); } 
  @catch (...) { SPLATCH(); @throw; }
}

int main()
{

  @try  {
     MYTRY();
  }

  @catch (Foo* localException) {
     MYCATCH();
     @throw localException;
  }
  
  // no catch clause
  @try { } 
  @finally { }
}


@interface INST
{
  INST* throw_val;
}

- (id) ThrowThis;

- (void) MainMeth;

@end


@implementation INST
- (id) ThrowThis { return 0; }

- (void) MainMeth {
  @try  {
     MYTRY();
  }
  @catch (Foo* localException) {
     MYCATCH();
     @throw [self ThrowThis];
  }
  @catch (...) {
    @throw [throw_val ThrowThis];
  }
}
@end

// rdar://13186010
@class NSDictionary, NSException;
@class NSMutableDictionary;

@interface NSString
+ (id)stringWithFormat:(NSString *)format, ... ;
@end

@interface  NSException
+ (NSException *)exceptionWithName:(NSString *)name reason:(NSString *)reason userInfo:(NSDictionary *)userInfo;
@end
id *_imp__NSInvalidArgumentException;

@interface NSSetExpression @end

@implementation NSSetExpression
-(id)expressionValueWithObject:(id)object context:(NSMutableDictionary*)bindings {
    id leftSet;
    id rightSet;
    @throw [NSException exceptionWithName: *_imp__NSInvalidArgumentException reason: [NSString stringWithFormat: @"Can't evaluate set expression; left subexpression not a set (lhs = %@ rhs = %@)", leftSet, rightSet] userInfo: 0];

    return leftSet ;
}
@end

