87 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
| // RUN: %clang_cc1 -fsyntax-only -verify -fblocks %s
 | |
| 
 | |
| void takevoidptr(void*);
 | |
| 
 | |
| 
 | |
| @interface Foo
 | |
| - iMethod;
 | |
| + cMethod;
 | |
| @end
 | |
| 
 | |
| @interface A
 | |
| + superClassMethod;
 | |
| - (void)instanceMethod;
 | |
| @end
 | |
| 
 | |
| @interface B : A
 | |
| - (void)instanceMethod;
 | |
| + classMethod;
 | |
| @end
 | |
| 
 | |
| @implementation B
 | |
| 
 | |
| - (void)instanceMethod {
 | |
|   [super iMethod]; // expected-warning{{'A' may not respond to 'iMethod'}}
 | |
|   
 | |
|   // Use of super in a block is ok and does codegen to the right thing.
 | |
|   // rdar://7852959
 | |
|   takevoidptr(^{
 | |
|     [super instanceMethod];
 | |
|   });
 | |
| }
 | |
| 
 | |
| + classMethod {
 | |
|   [super cMethod]; // expected-warning{{method '+cMethod' not found (return type defaults to 'id')}}
 | |
|   
 | |
|   id X[] = { [ super superClassMethod] };
 | |
|   id Y[] = {
 | |
|     [ super.superClassMethod iMethod],
 | |
|     super.superClassMethod,
 | |
|     (id)super.superClassMethod  // not a cast of super: rdar://7853261
 | |
|   };
 | |
|   return 0;
 | |
| }
 | |
| @end
 | |
| 
 | |
| @interface XX
 | |
| - m;
 | |
| @end
 | |
| 
 | |
| void f(id super) {
 | |
|   [super m];
 | |
| }
 | |
| void f0(int super) {
 | |
|   [super m]; // expected-warning{{receiver type 'int' is not 'id'}}
 | |
| }
 | |
| void f1(id puper) {  // expected-note {{'puper' declared here}}
 | |
|   [super m]; // expected-error{{use of undeclared identifier 'super'}}
 | |
| }
 | |
| 
 | |
| // radar 7400691
 | |
| typedef Foo super;
 | |
| 
 | |
| typedef Foo FooTD;
 | |
| 
 | |
| void test() {
 | |
|   [FooTD cMethod];
 | |
|   [super cMethod];
 | |
| }
 | |
| 
 | |
| struct SomeStruct {
 | |
|   int X;
 | |
| };
 | |
| 
 | |
| int test2() {
 | |
|   struct SomeStruct super = { 0 };
 | |
|   return super.X;
 | |
| }
 | |
| 
 | |
| int test3() {
 | |
|   id super = 0;
 | |
|   [(B*)super instanceMethod];
 | |
|   int *s1 = (int*)super;
 | |
|   
 | |
|   id X[] = { [ super superClassMethod] };
 | |
|   return 0;
 | |
| }
 |