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