78 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
// RUN: %clang_cc1 -x objective-c++ -triple x86_64-apple-darwin10 -fsyntax-only -verify -Wno-objc-root-class %s
 | 
						|
// rdar://9070460
 | 
						|
 | 
						|
class TCPPObject
 | 
						|
{
 | 
						|
public:
 | 
						|
	TCPPObject(const TCPPObject& inObj);
 | 
						|
	TCPPObject();
 | 
						|
	~TCPPObject();
 | 
						|
	
 | 
						|
	TCPPObject& operator=(const TCPPObject& inObj)const ; // expected-note {{'operator=' declared here}}
 | 
						|
 | 
						|
	void* Data();
 | 
						|
	
 | 
						|
private:
 | 
						|
	void* fData;
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
typedef const TCPPObject& CREF_TCPPObject;
 | 
						|
 | 
						|
@interface TNSObject
 | 
						|
@property (assign, readwrite, nonatomic) CREF_TCPPObject cppObjectNonAtomic;
 | 
						|
@property (assign, readwrite) CREF_TCPPObject cppObjectAtomic;
 | 
						|
@property (assign, readwrite, nonatomic) const TCPPObject& cppObjectDynamic;
 | 
						|
@end
 | 
						|
 | 
						|
 | 
						|
@implementation TNSObject
 | 
						|
 | 
						|
@synthesize cppObjectNonAtomic;
 | 
						|
@synthesize cppObjectAtomic; // expected-error{{atomic property of reference type 'CREF_TCPPObject' (aka 'const TCPPObject &') cannot have non-trivial assignment operator}}
 | 
						|
@dynamic cppObjectDynamic;
 | 
						|
 | 
						|
- (const TCPPObject&) cppObjectNonAtomic
 | 
						|
{
 | 
						|
	return cppObjectNonAtomic;
 | 
						|
}
 | 
						|
 | 
						|
- (void) setCppObjectNonAtomic: (const TCPPObject&)cppObject
 | 
						|
{
 | 
						|
	cppObjectNonAtomic = cppObject;
 | 
						|
}
 | 
						|
@end
 | 
						|
 | 
						|
 | 
						|
// <rdar://problem/11052352>
 | 
						|
@interface NSObject
 | 
						|
+ alloc;
 | 
						|
- init;
 | 
						|
- class;
 | 
						|
@end
 | 
						|
 | 
						|
template<typename T> void f() {
 | 
						|
  NSObject *o = [NSObject.alloc init];
 | 
						|
  [o class];
 | 
						|
}
 | 
						|
 | 
						|
template void f<int>();
 | 
						|
 | 
						|
// rdar://13602832
 | 
						|
//
 | 
						|
// Make sure that the default-argument checker looks through
 | 
						|
// pseudo-object expressions correctly.  The default argument
 | 
						|
// needs to force l2r to test this effectively because the checker
 | 
						|
// is syntactic and runs before placeholders are handled.
 | 
						|
@interface Test13602832
 | 
						|
- (int) x;
 | 
						|
@end
 | 
						|
namespace test13602832 {
 | 
						|
  template <int N> void foo(Test13602832 *a, int limit = a.x + N) {} // expected-error {{default argument references parameter 'a'}}
 | 
						|
 | 
						|
  void test(Test13602832 *a) {
 | 
						|
    // FIXME: this is a useless cascade error.
 | 
						|
    foo<1024>(a); // expected-error {{no matching function}}
 | 
						|
  }
 | 
						|
}
 |