|  | // RUN: %clang_cc1 -E %s -o %t.mm | 
|  | // RUN: %clang_cc1 -x objective-c++ -fblocks -fms-extensions -rewrite-objc %t.mm -o - | FileCheck %s | 
|  |  | 
|  | typedef void (^void_block_t)(void); | 
|  |  | 
|  | @interface PropertyClass { | 
|  | int q; | 
|  | void_block_t __completion; | 
|  | PropertyClass* YVAR; | 
|  | id ID; | 
|  | } | 
|  | @property int q; | 
|  | @property int r; | 
|  |  | 
|  | @property (copy) void_block_t completionBlock; | 
|  | @property (retain) PropertyClass* Yblock; | 
|  | @property (readonly) PropertyClass* readonlyAttr; | 
|  | @property (readonly,copy) PropertyClass* readonlyCopyAttr; | 
|  | @property (readonly,retain) PropertyClass* readonlyRetainAttr; | 
|  | @property (readonly,retain,nonatomic) PropertyClass* readonlyNonatomicAttr; | 
|  | @property (copy) id ID; | 
|  |  | 
|  | @end | 
|  |  | 
|  | @implementation PropertyClass | 
|  | @synthesize q;  // attributes should be "Ti,Vq" | 
|  | @dynamic r;     // attributes should be "Ti,D" | 
|  | @synthesize completionBlock=__completion; // "T@?,C,V__completion" | 
|  | @synthesize Yblock = YVAR; // "T@\"PropertyClass\",&,VYVAR" | 
|  | @synthesize readonlyAttr; | 
|  | @synthesize readonlyCopyAttr; | 
|  | @synthesize readonlyRetainAttr; | 
|  | @synthesize readonlyNonatomicAttr; | 
|  | @synthesize  ID; // "T@,C,VID" | 
|  | @end | 
|  |  | 
|  | // CHECK: Ti,Vq | 
|  | // CHECK: Ti,D | 
|  | // CHECK: T@?,C,V__completion | 
|  | // CHECK: T@\"PropertyClass\",&,VYVAR | 
|  | // CHECK: T@\"PropertyClass\",R,VreadonlyAttr | 
|  | // CHECK: T@\"PropertyClass\",R,C,VreadonlyCopyAttr | 
|  | // CHECK: T@\"PropertyClass\",R,&,VreadonlyRetainAttr | 
|  | // CHECK: T@\"PropertyClass\",R,&,N,VreadonlyNonatomicAttr | 
|  |  | 
|  | @interface Test @end | 
|  | @interface Test (Category) | 
|  | @property int q; | 
|  | @end | 
|  |  | 
|  | @implementation Test (Category) | 
|  | @dynamic q; | 
|  | @end | 
|  |  | 
|  | // CHECK: {{"q","Ti,D"}} |