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