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