|  | // 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"Class=struct objc_class *" -D"__declspec(X)=" %t-rw.cpp | 
|  |  | 
|  | typedef struct objc_object { | 
|  | Class isa; | 
|  | } *id; | 
|  |  | 
|  | void *sel_registerName(const char *); | 
|  |  | 
|  | id SYNCH_EXPR(); | 
|  | void SYNCH_BODY(); | 
|  | void  SYNCH_BEFORE(); | 
|  | void  SYNC_AFTER(); | 
|  |  | 
|  | void foo(id sem) | 
|  | { | 
|  | SYNCH_BEFORE(); | 
|  | @synchronized (SYNCH_EXPR()) { | 
|  | SYNCH_BODY(); | 
|  | return; | 
|  | } | 
|  | SYNC_AFTER(); | 
|  | @synchronized ([sem self]) { | 
|  | SYNCH_BODY(); | 
|  | return; | 
|  | } | 
|  | } | 
|  |  | 
|  | void test_sync_with_implicit_finally() { | 
|  | id foo; | 
|  | @synchronized (foo) { | 
|  | return; // The rewriter knows how to generate code for implicit finally | 
|  | } | 
|  | } | 
|  |  | 
|  | // rdar://14993814 | 
|  | @interface NSObject @end | 
|  |  | 
|  | @interface I : NSObject @end | 
|  |  | 
|  | @implementation I | 
|  | + (void) Meth { | 
|  | @synchronized(self) { | 
|  | } | 
|  | } | 
|  | @end |