| // RUN: %clang_cc1 -fsyntax-only -verify %s |
| |
| typedef signed char BOOL; |
| typedef unsigned int NSUInteger; |
| typedef struct _NSZone NSZone; |
| @class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator; |
| @protocol NSObject |
| - (BOOL)isEqual:(id)object; |
| @end |
| @protocol NSCopying - (id)copyWithZone:(NSZone *)zone; |
| @end |
| @protocol NSMutableCopying - (id)mutableCopyWithZone:(NSZone *)zone; |
| @end |
| @protocol NSCoding - (void)encodeWithCoder:(NSCoder *)aCoder; |
| @end |
| @interface NSObject <NSObject> {} |
| @end |
| extern id NSAllocateObject(Class aClass, NSUInteger extraBytes, NSZone *zone); |
| typedef struct { |
| id *itemsPtr; |
| unsigned long *mutationsPtr; |
| } NSFastEnumerationState; |
| @protocol NSFastEnumeration |
| - (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len; |
| @end |
| @class NSString; |
| @interface NSArray : NSObject <NSCopying, NSMutableCopying, NSCoding, NSFastEnumeration> - (NSUInteger)count; |
| @end |
| @interface NSMutableArray : NSArray - (void)addObject:(id)anObject; |
| @end |
| extern NSString * const NSUndoManagerCheckpointNotification; |
| @interface NSValueTransformer : NSObject {} @end |
| @class FooModel; |
| @interface FooObject : NSObject <NSCopying> {} |
| @end |
| @interface FooNode : FooObject {} |
| - (NSArray *) children; |
| @end |
| typedef enum { Foo_HUH_NONE } FooHUHCode; |
| @interface FooPlaypenEntry : FooNode { |
| NSMutableArray *_interestingChildren; |
| FooHUHCode _HUH; |
| __attribute__((objc_gc(weak))) FooPlaypenEntry *_mostInterestingChild; |
| id _author; |
| } |
| @property(copy) NSString *author; |
| - (BOOL) isInteresting; |
| @end NSString *FooHUHCodeToString(FooHUHCode HUH) { return 0; } |
| @interface FooHUHCodeToStringTransformer: NSValueTransformer { |
| } |
| @end @implementation FooPlaypenEntry @synthesize author = _author; |
| - (BOOL) isInteresting { return 1; } |
| - (NSArray *) interestingChildren { |
| if (!_interestingChildren) { |
| for (FooPlaypenEntry *child in [self children]) { |
| if ([child isInteresting]) { |
| if (!_mostInterestingChild) |
| _mostInterestingChild = child; |
| else if (child->_HUH > _mostInterestingChild->_HUH) |
| _mostInterestingChild = child; |
| } |
| } |
| } |
| return 0; |
| } |
| - (FooHUHCode) HUH { |
| if (_HUH == Foo_HUH_NONE) { |
| if (_mostInterestingChild) |
| return [_mostInterestingChild HUH]; |
| } |
| return 0; |
| } |
| @end |
| |
| // rdar://problem/9123040 |
| @interface Test1 { |
| @public |
| id ivar __attribute__((objc_gc(weak))); |
| } |
| @property (assign) id prop __attribute((objc_gc(weak))); |
| @end |
| void test1(Test1 *t) { |
| id *(__attribute__((objc_gc(strong))) x) = &t->ivar; // expected-warning {{initializing '__strong id *' with an expression of type '__weak id *' discards qualifiers}} |
| } |