xref: /aosp_15_r20/external/clang/test/SemaObjCXX/property-synthesis-error.mm (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s
2*67e74705SXin Li// rdar: //8550657
3*67e74705SXin Li
4*67e74705SXin Li@interface NSArray @end
5*67e74705SXin Li
6*67e74705SXin Li@interface NSMutableArray : NSArray @end
7*67e74705SXin Li
8*67e74705SXin Li@interface MyClass
9*67e74705SXin Li{
10*67e74705SXin Li  NSMutableArray * _array;
11*67e74705SXin Li}
12*67e74705SXin Li
13*67e74705SXin Li@property (readonly) NSMutableArray * array;
14*67e74705SXin Li
15*67e74705SXin Li@end
16*67e74705SXin Li
17*67e74705SXin Li@interface MyClass ()
18*67e74705SXin Li
19*67e74705SXin Li@property (readwrite, retain) NSMutableArray * array;
20*67e74705SXin Li
21*67e74705SXin Li@end
22*67e74705SXin Li
23*67e74705SXin Li@implementation MyClass
24*67e74705SXin Li
25*67e74705SXin Li@synthesize array=_array;
26*67e74705SXin Li
27*67e74705SXin Li@end
28*67e74705SXin Li
29*67e74705SXin Liint main(void)
30*67e74705SXin Li{
31*67e74705SXin Li  return 0;
32*67e74705SXin Li}
33*67e74705SXin Li
34*67e74705SXin Li// rdar://6137845
35*67e74705SXin Liclass TCPPObject
36*67e74705SXin Li{
37*67e74705SXin Lipublic:
38*67e74705SXin Li TCPPObject(const TCPPObject& inObj);
39*67e74705SXin Li TCPPObject();
40*67e74705SXin Li ~TCPPObject();
41*67e74705SXin Li TCPPObject& operator=(const TCPPObject& inObj); // expected-note {{'operator=' declared here}}
42*67e74705SXin Liprivate:
43*67e74705SXin Li void* fData;
44*67e74705SXin Li};
45*67e74705SXin Li
46*67e74705SXin Liclass Trivial
47*67e74705SXin Li{
48*67e74705SXin Lipublic:
49*67e74705SXin Li Trivial(const Trivial& inObj);
50*67e74705SXin Li Trivial();
51*67e74705SXin Li ~Trivial();
52*67e74705SXin Liprivate:
53*67e74705SXin Li void* fData;
54*67e74705SXin Li};
55*67e74705SXin Li
56*67e74705SXin Li@interface MyDocument
57*67e74705SXin Li{
58*67e74705SXin Li@private
59*67e74705SXin Li TCPPObject _cppObject;
60*67e74705SXin Li TCPPObject _ncppObject;
61*67e74705SXin Li Trivial _tcppObject;
62*67e74705SXin Li}
63*67e74705SXin Li@property (assign, readwrite) const TCPPObject& cppObject;
64*67e74705SXin Li@property (assign, readwrite, nonatomic) const TCPPObject& ncppObject;
65*67e74705SXin Li@property (assign, readwrite) const Trivial& tcppObject;
66*67e74705SXin Li@end
67*67e74705SXin Li
68*67e74705SXin Li@implementation MyDocument
69*67e74705SXin Li
70*67e74705SXin Li@synthesize cppObject = _cppObject; // expected-error {{atomic property of reference type 'const TCPPObject &' cannot have non-trivial assignment operator}}
71*67e74705SXin Li@synthesize ncppObject = _ncppObject;
72*67e74705SXin Li
73*67e74705SXin Li@synthesize tcppObject = _tcppObject;
74*67e74705SXin Li@end
75*67e74705SXin Li
76*67e74705SXin Listruct IncompleteStruct; // expected-note 2 {{forward declaration of 'IncompleteStruct'}}
77*67e74705SXin Listruct ConvertToIncomplete { operator IncompleteStruct&(); };
78*67e74705SXin Li@interface SynthIncompleteRef
79*67e74705SXin Li@property (readonly, nonatomic) IncompleteStruct& x; // expected-note {{property declared here}}
80*67e74705SXin Li@property (readonly, nonatomic) IncompleteStruct& y; // expected-note {{property declared here}}
81*67e74705SXin Li@end
82*67e74705SXin Li
83*67e74705SXin Li@implementation SynthIncompleteRef // expected-error {{cannot synthesize property 'x' with incomplete type 'IncompleteStruct'}}
84*67e74705SXin Li@synthesize y; // expected-error {{cannot synthesize property 'y' with incomplete type 'IncompleteStruct'}}
85*67e74705SXin Li@end
86*67e74705SXin Li
87*67e74705SXin Li
88*67e74705SXin Li// Check error handling for instantiation during property synthesis.
89*67e74705SXin Litemplate<typename T> class TemplateClass1 {
90*67e74705SXin Li  T *x; // expected-error {{'x' declared as a pointer to a reference of type 'int &'}}
91*67e74705SXin Li};
92*67e74705SXin Litemplate<typename T> class TemplateClass2 {
93*67e74705SXin Li  TemplateClass2& operator=(TemplateClass1<T>);
94*67e74705SXin Li  TemplateClass2& operator=(TemplateClass2) { T(); } // expected-error {{reference to type 'int' requires an initializer}} \
95*67e74705SXin Li                                                     // expected-note 2 {{implicitly declared private here}} \
96*67e74705SXin Li                                                     // expected-note {{'operator=' declared here}}
97*67e74705SXin Li};
98*67e74705SXin Li__attribute__((objc_root_class)) @interface InterfaceWithTemplateProperties
99*67e74705SXin Li@property TemplateClass2<int&> intprop;
100*67e74705SXin Li@property TemplateClass2<int&> &floatprop;
101*67e74705SXin Li@end
102*67e74705SXin Li@implementation InterfaceWithTemplateProperties // expected-error 2 {{'operator=' is a private member of 'TemplateClass2<int &>'}} \
103*67e74705SXin Li																								// expected-error {{atomic property of reference type 'TemplateClass2<int &> &' cannot have non-trivial assignment operator}} \
104*67e74705SXin Li																								// expected-note {{in instantiation of template class}} \
105*67e74705SXin Li																								// expected-note {{in instantiation of member function}}
106*67e74705SXin Li@end
107