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 29 int main(void) 30 { 31 return 0; 32 } 33 34 // rdar://6137845 35 class TCPPObject 36 { 37 public: 38 TCPPObject(const TCPPObject& inObj); 39 TCPPObject(); 40 ~TCPPObject(); 41 TCPPObject& operator=(const TCPPObject& inObj); // expected-note {{'operator=' declared here}} 42 private: 43 void* fData; 44 }; 45 46 class Trivial 47 { 48 public: 49 Trivial(const Trivial& inObj); 50 Trivial(); 51 ~Trivial(); 52 private: 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 76 struct IncompleteStruct; // expected-note 2 {{forward declaration of 'IncompleteStruct'}} 77 struct 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. 89 template<typename T> class TemplateClass1 { 90 T *x; // expected-error {{'x' declared as a pointer to a reference of type 'int &'}} 91 }; 92 template<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