1// RUN: %clang_cc1 -fsyntax-only -verify -fblocks %s 2 3void takevoidptr(void*); 4 5 6@interface Foo 7- iMethod; 8+ cMethod; 9@end 10 11@interface A 12+ superClassMethod; 13- (void)instanceMethod; 14@end 15 16@interface B : A 17- (void)instanceMethod; 18+ classMethod; 19@end 20 21@implementation B 22 23- (void)instanceMethod { 24 [super iMethod]; // expected-warning{{'A' may not respond to 'iMethod'}} 25 26 // Use of super in a block is ok and does codegen to the right thing. 27 // rdar://7852959 28 takevoidptr(^{ 29 [super instanceMethod]; 30 }); 31} 32 33+ classMethod { 34 [super cMethod]; // expected-warning{{method '+cMethod' not found (return type defaults to 'id')}} 35 36 id X[] = { [ super superClassMethod] }; 37 id Y[] = { 38 [ super.superClassMethod iMethod], 39 super.superClassMethod, 40 (id)super.superClassMethod // not a cast of super: rdar://7853261 41 }; 42 return 0; 43} 44@end 45 46@interface XX 47- m; 48@end 49 50void f(id super) { 51 [super m]; 52} 53void f0(int super) { 54 [super m]; // expected-warning{{receiver type 'int' is not 'id'}} 55} 56void f1(id puper) { // expected-note {{'puper' declared here}} 57 [super m]; // expected-error{{use of undeclared identifier 'super'}} 58} 59 60// radar 7400691 61typedef Foo super; 62 63typedef Foo FooTD; 64 65void test() { 66 [FooTD cMethod]; 67 [super cMethod]; 68} 69 70struct SomeStruct { 71 int X; 72}; 73 74int test2() { 75 struct SomeStruct super = { 0 }; 76 return super.X; 77} 78 79int test3() { 80 id super = 0; 81 [(B*)super instanceMethod]; 82 int *s1 = (int*)super; 83 84 id X[] = { [ super superClassMethod] }; 85 return 0; 86} 87