1*67e74705SXin Li// RUN: %clang_cc1 -fsyntax-only -verify %s 2*67e74705SXin Li 3*67e74705SXin Li#include <stddef.h> 4*67e74705SXin Li 5*67e74705SXin Litypedef struct objc_object *id; 6*67e74705SXin Liid objc_getClass(const char *s); 7*67e74705SXin Li 8*67e74705SXin Li@interface Object 9*67e74705SXin Li- (id) initWithInt: (int) i; 10*67e74705SXin Li@end 11*67e74705SXin Li 12*67e74705SXin Li@protocol Func 13*67e74705SXin Li+ (int) class_func0; 14*67e74705SXin Li- (int) instance_func0; 15*67e74705SXin Li@end 16*67e74705SXin Li 17*67e74705SXin Li@interface Derived: Object // expected-note {{receiver is instance of class declared here}} 18*67e74705SXin Li+ (int) class_func1; 19*67e74705SXin Li+ (int) class_func2; 20*67e74705SXin Li+ (int) class_func3; 21*67e74705SXin Li+ (int) class_func4; 22*67e74705SXin Li+ (int) class_func5; 23*67e74705SXin Li+ (int) class_func6; 24*67e74705SXin Li+ (int) class_func7; 25*67e74705SXin Li- (int) instance_func1; 26*67e74705SXin Li- (int) instance_func2; 27*67e74705SXin Li- (int) instance_func3; 28*67e74705SXin Li- (int) instance_func4; 29*67e74705SXin Li- (int) instance_func5; 30*67e74705SXin Li- (int) instance_func6; 31*67e74705SXin Li- (int) instance_func7; 32*67e74705SXin Li- (id) initWithInt: (int) i; 33*67e74705SXin Li@end 34*67e74705SXin Li 35*67e74705SXin Li@implementation Derived 36*67e74705SXin Li+ (int) class_func1 37*67e74705SXin Li{ 38*67e74705SXin Li int i = (size_t)[self class_func0]; // expected-warning {{class method '+class_func0' not found (return type defaults to 'id'); did you mean '+class_func}} 39*67e74705SXin Li return i + (size_t)[super class_func0]; // expected-warning {{class method '+class_func0' not found (return type defaults to 'id')}} 40*67e74705SXin Li} 41*67e74705SXin Li+ (int) class_func2 42*67e74705SXin Li{ 43*67e74705SXin Li int i = [(id <Func>)self class_func0]; 44*67e74705SXin Li i += [(id <Func>)super class_func0]; // expected-error {{cannot cast 'super' (it isn't an expression)}} 45*67e74705SXin Li i += [(Class <Func>)self class_func0]; // 46*67e74705SXin Li return i + [(Class <Func>)super class_func0]; // // expected-error {{cannot cast 'super' (it isn't an expression)}} 47*67e74705SXin Li} 48*67e74705SXin Li+ (int) class_func3 49*67e74705SXin Li{ 50*67e74705SXin Li return [(Object <Func> *)super class_func0]; // expected-error {{cannot cast 'super' (it isn't an expression)}} 51*67e74705SXin Li} 52*67e74705SXin Li+ (int) class_func4 53*67e74705SXin Li{ 54*67e74705SXin Li return [(Derived <Func> *)super class_func0]; // expected-error {{cannot cast 'super' (it isn't an expression)}} 55*67e74705SXin Li} 56*67e74705SXin Li+ (int) class_func5 57*67e74705SXin Li{ 58*67e74705SXin Li int i = (size_t)[Derived class_func0]; // expected-warning {{class method '+class_func0' not found (return type defaults to 'id')}} 59*67e74705SXin Li return i + (size_t)[Object class_func0]; // expected-warning {{class method '+class_func0' not found (return type defaults to 'id')}} 60*67e74705SXin Li} 61*67e74705SXin Li+ (int) class_func6 62*67e74705SXin Li{ 63*67e74705SXin Li return (size_t)[objc_getClass("Object") class_func1]; // GCC warns about this 64*67e74705SXin Li} 65*67e74705SXin Li+ (int) class_func7 66*67e74705SXin Li{ 67*67e74705SXin Li return [objc_getClass("Derived") class_func1]; 68*67e74705SXin Li} 69*67e74705SXin Li- (int) instance_func1 70*67e74705SXin Li{ 71*67e74705SXin Li int i = (size_t)[self instance_func0]; // expected-warning {{instance method '-instance_func0' not found (return type defaults to 'id'); did you mean}} 72*67e74705SXin Li return i + (size_t)[super instance_func0]; // expected-warning {{'Object' may not respond to 'instance_func0'}} 73*67e74705SXin Li} 74*67e74705SXin Li- (int) instance_func2 75*67e74705SXin Li{ 76*67e74705SXin Li return [(id <Func>)super instance_func0]; // expected-error {{cannot cast 'super' (it isn't an expression)}} 77*67e74705SXin Li} 78*67e74705SXin Li- (int) instance_func3 79*67e74705SXin Li{ 80*67e74705SXin Li return [(Object <Func> *)super instance_func0]; // expected-error {{cannot cast 'super' (it isn't an expression)}} 81*67e74705SXin Li} 82*67e74705SXin Li- (int) instance_func4 83*67e74705SXin Li{ 84*67e74705SXin Li return [(Derived <Func> *)super instance_func0]; // expected-error {{cannot cast 'super' (it isn't an expression)}} 85*67e74705SXin Li} 86*67e74705SXin Li- (int) instance_func5 87*67e74705SXin Li{ 88*67e74705SXin Li int i = (size_t)[Derived instance_func1]; // expected-warning {{class method '+instance_func1' not found (return type defaults to 'id')}} 89*67e74705SXin Li return i + (size_t)[Object instance_func1]; // expected-warning {{class method '+instance_func1' not found (return type defaults to 'id')}} 90*67e74705SXin Li} 91*67e74705SXin Li- (int) instance_func6 92*67e74705SXin Li{ 93*67e74705SXin Li return (size_t)[objc_getClass("Object") class_func1]; 94*67e74705SXin Li} 95*67e74705SXin Li- (int) instance_func7 96*67e74705SXin Li{ 97*67e74705SXin Li return [objc_getClass("Derived") class_func1]; 98*67e74705SXin Li} 99*67e74705SXin Li- (id) initWithInt: (int) i 100*67e74705SXin Li{ 101*67e74705SXin Li // Don't warn about parentheses here. 102*67e74705SXin Li if (self = [super initWithInt: i]) { 103*67e74705SXin Li [self instance_func1]; 104*67e74705SXin Li } 105*67e74705SXin Li return self; 106*67e74705SXin Li} 107*67e74705SXin Li@end 108*67e74705SXin Li 109