xref: /aosp_15_r20/external/clang/test/SemaObjC/weak-attr-ivar.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li
3*67e74705SXin Litypedef signed char BOOL;
4*67e74705SXin Litypedef unsigned int NSUInteger;
5*67e74705SXin Litypedef struct _NSZone NSZone;
6*67e74705SXin Li@class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator;
7*67e74705SXin Li@protocol NSObject
8*67e74705SXin Li- (BOOL)isEqual:(id)object;
9*67e74705SXin Li@end
10*67e74705SXin Li@protocol NSCopying  - (id)copyWithZone:(NSZone *)zone;
11*67e74705SXin Li@end
12*67e74705SXin Li@protocol NSMutableCopying  - (id)mutableCopyWithZone:(NSZone *)zone;
13*67e74705SXin Li@end
14*67e74705SXin Li@protocol NSCoding  - (void)encodeWithCoder:(NSCoder *)aCoder;
15*67e74705SXin Li@end
16*67e74705SXin Li@interface NSObject <NSObject> {}
17*67e74705SXin Li@end
18*67e74705SXin Liextern id NSAllocateObject(Class aClass, NSUInteger extraBytes, NSZone *zone);
19*67e74705SXin Litypedef struct {
20*67e74705SXin Li  id *itemsPtr;
21*67e74705SXin Li  unsigned long *mutationsPtr;
22*67e74705SXin Li} NSFastEnumerationState;
23*67e74705SXin Li@protocol NSFastEnumeration
24*67e74705SXin Li- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len;
25*67e74705SXin Li@end
26*67e74705SXin Li@class NSString;
27*67e74705SXin Li@interface NSArray : NSObject <NSCopying, NSMutableCopying, NSCoding, NSFastEnumeration>  - (NSUInteger)count;
28*67e74705SXin Li@end
29*67e74705SXin Li@interface NSMutableArray : NSArray  - (void)addObject:(id)anObject;
30*67e74705SXin Li@end
31*67e74705SXin Liextern NSString * const NSUndoManagerCheckpointNotification;
32*67e74705SXin Li@interface NSValueTransformer : NSObject {} @end
33*67e74705SXin Li@class FooModel;
34*67e74705SXin Li@interface FooObject : NSObject <NSCopying> {}
35*67e74705SXin Li@end
36*67e74705SXin Li@interface FooNode : FooObject {}
37*67e74705SXin Li- (NSArray *) children;
38*67e74705SXin Li@end
39*67e74705SXin Litypedef enum { Foo_HUH_NONE } FooHUHCode;
40*67e74705SXin Li@interface FooPlaypenEntry : FooNode {
41*67e74705SXin Li  NSMutableArray *_interestingChildren;
42*67e74705SXin Li  FooHUHCode _HUH;
43*67e74705SXin Li  __attribute__((objc_gc(weak))) FooPlaypenEntry *_mostInterestingChild;
44*67e74705SXin Li  id _author;
45*67e74705SXin Li}
46*67e74705SXin Li@property(copy) NSString *author;
47*67e74705SXin Li- (BOOL) isInteresting;
48*67e74705SXin Li@end  NSString *FooHUHCodeToString(FooHUHCode HUH) { return 0; }
49*67e74705SXin Li@interface FooHUHCodeToStringTransformer: NSValueTransformer {
50*67e74705SXin Li}
51*67e74705SXin Li@end  @implementation FooPlaypenEntry  @synthesize author = _author;
52*67e74705SXin Li- (BOOL) isInteresting { return 1; }
53*67e74705SXin Li- (NSArray *) interestingChildren {
54*67e74705SXin Li  if (!_interestingChildren) {
55*67e74705SXin Li    for (FooPlaypenEntry *child in [self children]) {
56*67e74705SXin Li      if ([child isInteresting]) {
57*67e74705SXin Li        if (!_mostInterestingChild)
58*67e74705SXin Li          _mostInterestingChild = child;
59*67e74705SXin Li        else if (child->_HUH > _mostInterestingChild->_HUH)
60*67e74705SXin Li          _mostInterestingChild = child;
61*67e74705SXin Li      }
62*67e74705SXin Li    }
63*67e74705SXin Li  }
64*67e74705SXin Li  return 0;
65*67e74705SXin Li}
66*67e74705SXin Li- (FooHUHCode) HUH {
67*67e74705SXin Li  if (_HUH == Foo_HUH_NONE) {
68*67e74705SXin Li    if (_mostInterestingChild)
69*67e74705SXin Li      return [_mostInterestingChild HUH];
70*67e74705SXin Li  }
71*67e74705SXin Li  return 0;
72*67e74705SXin Li}
73*67e74705SXin Li@end
74*67e74705SXin Li
75*67e74705SXin Li// rdar://problem/9123040
76*67e74705SXin Li@interface Test1 {
77*67e74705SXin Li@public
78*67e74705SXin Li  id ivar __attribute__((objc_gc(weak)));
79*67e74705SXin Li}
80*67e74705SXin Li@property (assign) id prop __attribute((objc_gc(weak)));
81*67e74705SXin Li@end
82*67e74705SXin Livoid test1(Test1 *t) {
83*67e74705SXin Li  id *(__attribute__((objc_gc(strong))) x) = &t->ivar; // expected-warning {{initializing '__strong id *' with an expression of type '__weak id *' discards qualifiers}}
84*67e74705SXin Li}
85