1*67e74705SXin Li// RUN: %clang_cc1 -x objective-c++ -triple x86_64-apple-darwin10 -fsyntax-only -verify -Wno-objc-root-class %s 2*67e74705SXin Li// rdar://9070460 3*67e74705SXin Li 4*67e74705SXin Liclass TCPPObject 5*67e74705SXin Li{ 6*67e74705SXin Lipublic: 7*67e74705SXin Li TCPPObject(const TCPPObject& inObj); 8*67e74705SXin Li TCPPObject(); 9*67e74705SXin Li ~TCPPObject(); 10*67e74705SXin Li 11*67e74705SXin Li TCPPObject& operator=(const TCPPObject& inObj)const ; // expected-note {{'operator=' declared here}} 12*67e74705SXin Li 13*67e74705SXin Li void* Data(); 14*67e74705SXin Li 15*67e74705SXin Liprivate: 16*67e74705SXin Li void* fData; 17*67e74705SXin Li}; 18*67e74705SXin Li 19*67e74705SXin Li 20*67e74705SXin Litypedef const TCPPObject& CREF_TCPPObject; 21*67e74705SXin Li 22*67e74705SXin Li@interface TNSObject 23*67e74705SXin Li@property (assign, readwrite, nonatomic) CREF_TCPPObject cppObjectNonAtomic; 24*67e74705SXin Li@property (assign, readwrite) CREF_TCPPObject cppObjectAtomic; 25*67e74705SXin Li@property (assign, readwrite, nonatomic) const TCPPObject& cppObjectDynamic; 26*67e74705SXin Li@end 27*67e74705SXin Li 28*67e74705SXin Li 29*67e74705SXin Li@implementation TNSObject 30*67e74705SXin Li 31*67e74705SXin Li@synthesize cppObjectNonAtomic; 32*67e74705SXin Li@synthesize cppObjectAtomic; // expected-error{{atomic property of reference type 'CREF_TCPPObject' (aka 'const TCPPObject &') cannot have non-trivial assignment operator}} 33*67e74705SXin Li@dynamic cppObjectDynamic; 34*67e74705SXin Li 35*67e74705SXin Li- (const TCPPObject&) cppObjectNonAtomic 36*67e74705SXin Li{ 37*67e74705SXin Li return cppObjectNonAtomic; 38*67e74705SXin Li} 39*67e74705SXin Li 40*67e74705SXin Li- (void) setCppObjectNonAtomic: (const TCPPObject&)cppObject 41*67e74705SXin Li{ 42*67e74705SXin Li cppObjectNonAtomic = cppObject; 43*67e74705SXin Li} 44*67e74705SXin Li@end 45*67e74705SXin Li 46*67e74705SXin Li 47*67e74705SXin Li// <rdar://problem/11052352> 48*67e74705SXin Li@interface NSObject 49*67e74705SXin Li+ alloc; 50*67e74705SXin Li- init; 51*67e74705SXin Li- class; 52*67e74705SXin Li@end 53*67e74705SXin Li 54*67e74705SXin Litemplate<typename T> void f() { 55*67e74705SXin Li NSObject *o = [NSObject.alloc init]; 56*67e74705SXin Li [o class]; 57*67e74705SXin Li} 58*67e74705SXin Li 59*67e74705SXin Litemplate void f<int>(); 60*67e74705SXin Li 61*67e74705SXin Li// rdar://13602832 62*67e74705SXin Li// 63*67e74705SXin Li// Make sure that the default-argument checker looks through 64*67e74705SXin Li// pseudo-object expressions correctly. The default argument 65*67e74705SXin Li// needs to force l2r to test this effectively because the checker 66*67e74705SXin Li// is syntactic and runs before placeholders are handled. 67*67e74705SXin Li@interface Test13602832 68*67e74705SXin Li- (int) x; 69*67e74705SXin Li@end 70*67e74705SXin Linamespace test13602832 { 71*67e74705SXin Li template <int N> void foo(Test13602832 *a, int limit = a.x + N) {} // expected-error {{default argument references parameter 'a'}} 72*67e74705SXin Li 73*67e74705SXin Li void test(Test13602832 *a) { 74*67e74705SXin Li // FIXME: this is a useless cascade error. 75*67e74705SXin Li foo<1024>(a); // expected-error {{no matching function}} 76*67e74705SXin Li } 77*67e74705SXin Li} 78