121 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
| // RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s
 | |
| 
 | |
| typedef struct objc_object {
 | |
|   Class isa;
 | |
| } *id;
 | |
| 
 | |
| 
 | |
| @interface foo
 | |
| - (void)meth;
 | |
| @end
 | |
| 
 | |
| @implementation foo
 | |
| - (void) contents {}			// No declaration in @interface!
 | |
| - (void) meth { [self contents]; } 
 | |
| @end
 | |
| 
 | |
| typedef struct _NSPoint {
 | |
|     float x;
 | |
|     float y;
 | |
| } NSPoint;
 | |
| 
 | |
| typedef struct _NSSize {
 | |
|     float width; 
 | |
|     float height;
 | |
| } NSSize;
 | |
| 
 | |
| typedef struct _NSRect {
 | |
|     NSPoint origin;
 | |
|     NSSize size;
 | |
| } NSRect;
 | |
| 
 | |
| @interface AnyClass
 | |
| - (NSRect)rect;
 | |
| @end
 | |
| 
 | |
| @class Helicopter;
 | |
| 
 | |
| static void func(Helicopter *obj) {
 | |
|   // Note that the proto for "rect" is found in the global pool even when
 | |
|   // a statically typed object's class interface isn't in scope! This 
 | |
|   // behavior isn't very desirable, however wee need it for GCC compatibility.
 | |
|   NSRect r = [obj rect];
 | |
| }
 | |
| 
 | |
| @interface NSObject @end
 | |
| 
 | |
| extern Class NSClassFromObject(id object);
 | |
| 
 | |
| @interface XX : NSObject 
 | |
| @end
 | |
| 
 | |
| @implementation XX
 | |
| 
 | |
| + _privateMethod {
 | |
|   return self;
 | |
| }
 | |
| 
 | |
| - (void) xx {
 | |
|   [NSClassFromObject(self) _privateMethod];
 | |
| }
 | |
| @end
 | |
| 
 | |
| @implementation XX (Private)
 | |
| - (void) yy {
 | |
|   [NSClassFromObject(self) _privateMethod];
 | |
| }
 | |
| @end
 | |
| 
 | |
| @interface I0
 | |
| -(void) nonVararg: (int) x;
 | |
| @end
 | |
| 
 | |
| int f0(I0 *ob) {
 | |
|   [ ob nonVararg: 0, 1, 2]; // expected-error {{too many arguments to method call}}
 | |
| }
 | |
| 
 | |
| int f2() {
 | |
|     const id foo;
 | |
|     [foo bar];  // expected-warning {{method '-bar' not found (return type defaults to 'id')}}
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| 
 | |
| // PR3766
 | |
| struct S { int X; } S;
 | |
| 
 | |
| int test5(int X) {
 | |
|   int a = [X somemsg];  // expected-warning {{receiver type 'int' is not 'id'}} \
 | |
|                            expected-warning {{method '-somemsg' not found}} \
 | |
|                            expected-warning {{incompatible pointer to integer conversion initializing 'int' with an expression of type 'id'}}
 | |
|   int b = [S somemsg];  // expected-error {{bad receiver type 'struct S'}}
 | |
| }
 | |
| 
 | |
| // PR4021
 | |
| void foo4() {
 | |
|   struct objc_object X[10];
 | |
|   
 | |
|   [X rect]; // expected-warning {{receiver type 'struct objc_object *' is not 'id' or interface pointer, consider casting it to 'id'}}
 | |
| }
 | |
| 
 | |
| // rdar://13207886
 | |
| void foo5(id p) {
 | |
|   p
 | |
|   [(id)(p) bar]; // expected-error {{missing '['}} \
 | |
|                  // expected-error {{expected ']'}} \
 | |
|                  // expected-note {{to match this '['}} \
 | |
|                  // expected-warning {{instance method '-bar' not found}}
 | |
| }
 | |
| 
 | |
| @interface I1 // expected-note {{receiver is instance of class declared here}}
 | |
| -(void)unavail_meth  __attribute__((unavailable)); // expected-note {{marked unavailable here}}
 | |
| @end
 | |
| 
 | |
| // rdar://13620447
 | |
| void foo6(I1 *p) {
 | |
|   [p
 | |
|     bar]; // expected-warning {{instance method '-bar' not found}}
 | |
|   [p
 | |
|     unavail_meth]; // expected-error {{unavailable}}
 | |
| }
 |