1*67e74705SXin Li// RUN: %clang_cc1 -fsyntax-only -fobjc-runtime=macosx-fragile-10.5 -verify -Wno-objc-root-class %s 2*67e74705SXin Li// RUN: %clang_cc1 -fsyntax-only -fobjc-runtime=macosx-fragile-10.5 -verify -Wno-objc-root-class -std=c++98 %s 3*67e74705SXin Li// RUN: %clang_cc1 -fsyntax-only -fobjc-runtime=macosx-fragile-10.5 -verify -Wno-objc-root-class -std=c++11 %s 4*67e74705SXin Li 5*67e74705SXin Li@interface I1 6*67e74705SXin Li- (int*)method; 7*67e74705SXin Li@end 8*67e74705SXin Li 9*67e74705SXin Li@implementation I1 10*67e74705SXin Li- (int*)method { 11*67e74705SXin Li struct x { }; 12*67e74705SXin Li [x method]; // expected-error{{receiver type 'x' is not an Objective-C class}} 13*67e74705SXin Li return 0; 14*67e74705SXin Li} 15*67e74705SXin Li@end 16*67e74705SXin Li 17*67e74705SXin Litypedef struct { int x; } ivar; 18*67e74705SXin Li 19*67e74705SXin Li@interface I2 { 20*67e74705SXin Li id ivar; 21*67e74705SXin Li} 22*67e74705SXin Li- (int*)method; 23*67e74705SXin Li+ (void)method; 24*67e74705SXin Li@end 25*67e74705SXin Li 26*67e74705SXin Listruct I2_holder { 27*67e74705SXin Li I2_holder(); 28*67e74705SXin Li 29*67e74705SXin Li I2 *get(); 30*67e74705SXin Li}; 31*67e74705SXin Li 32*67e74705SXin LiI2 *operator+(I2_holder, int); 33*67e74705SXin Li 34*67e74705SXin Li@implementation I2 35*67e74705SXin Li- (int*)method { 36*67e74705SXin Li [ivar method]; 37*67e74705SXin Li 38*67e74705SXin Li // Test instance messages that start with a simple-type-specifier. 39*67e74705SXin Li [I2_holder().get() method]; 40*67e74705SXin Li [I2_holder().get() + 17 method]; 41*67e74705SXin Li return 0; 42*67e74705SXin Li} 43*67e74705SXin Li+ (void)method { 44*67e74705SXin Li [ivar method]; // expected-error{{receiver type 'ivar' is not an Objective-C class}} 45*67e74705SXin Li} 46*67e74705SXin Li@end 47*67e74705SXin Li 48*67e74705SXin Li// Class message sends 49*67e74705SXin Li@interface I3 50*67e74705SXin Li+ (int*)method; 51*67e74705SXin Li@end 52*67e74705SXin Li 53*67e74705SXin Li@interface I4 : I3 54*67e74705SXin Li+ (int*)otherMethod; 55*67e74705SXin Li@end 56*67e74705SXin Li 57*67e74705SXin Litemplate<typename T> 58*67e74705SXin Listruct identity { 59*67e74705SXin Li typedef T type; 60*67e74705SXin Li}; 61*67e74705SXin Li 62*67e74705SXin Li@implementation I4 63*67e74705SXin Li+ (int *)otherMethod { 64*67e74705SXin Li // Test class messages that use non-trivial simple-type-specifiers 65*67e74705SXin Li // or typename-specifiers. 66*67e74705SXin Li if (false) { 67*67e74705SXin Li if (true) 68*67e74705SXin Li return [typename identity<I3>::type method]; 69*67e74705SXin Li#if __cplusplus <= 199711L 70*67e74705SXin Li // expected-warning@-2 {{'typename' occurs outside of a template}} 71*67e74705SXin Li#endif 72*67e74705SXin Li 73*67e74705SXin Li return [::I3 method]; 74*67e74705SXin Li } 75*67e74705SXin Li 76*67e74705SXin Li int* ip1 = {[super method]}; 77*67e74705SXin Li int* ip2 = {[::I3 method]}; 78*67e74705SXin Li int* ip3 = {[typename identity<I3>::type method]}; 79*67e74705SXin Li#if __cplusplus <= 199711L 80*67e74705SXin Li // expected-warning@-2 {{'typename' occurs outside of a template}} 81*67e74705SXin Li#endif 82*67e74705SXin Li 83*67e74705SXin Li int* ip4 = {[typename identity<I2_holder>::type().get() method]}; 84*67e74705SXin Li#if __cplusplus <= 199711L 85*67e74705SXin Li // expected-warning@-2 {{'typename' occurs outside of a template}} 86*67e74705SXin Li#endif 87*67e74705SXin Li int array[5] = {[3] = 2}; 88*67e74705SXin Li return [super method]; 89*67e74705SXin Li} 90*67e74705SXin Li@end 91*67e74705SXin Li 92*67e74705SXin Listruct String { 93*67e74705SXin Li String(const char *); 94*67e74705SXin Li}; 95*67e74705SXin Li 96*67e74705SXin Listruct MutableString : public String { }; 97*67e74705SXin Li 98*67e74705SXin Li// C++-specific parameter types 99*67e74705SXin Li@interface I5 100*67e74705SXin Li- method:(const String&)str1 101*67e74705SXin Li other:(String&)str2; // expected-note{{passing argument to parameter 'str2' here}} 102*67e74705SXin Li@end 103*67e74705SXin Li 104*67e74705SXin Livoid test_I5(I5 *i5, String s) { 105*67e74705SXin Li [i5 method:"hello" other:s]; 106*67e74705SXin Li [i5 method:s other:"world"]; // expected-error{{non-const lvalue reference to type 'String' cannot bind to a value of unrelated type 'const char [6]'}} 107*67e74705SXin Li} 108*67e74705SXin Li 109*67e74705SXin Li// <rdar://problem/8483253> 110*67e74705SXin Li@interface A 111*67e74705SXin Li 112*67e74705SXin Listruct X { }; 113*67e74705SXin Li 114*67e74705SXin Li+ (A *)create:(void (*)(void *x, X r, void *data))callback 115*67e74705SXin Li callbackData:(void *)callback_data; 116*67e74705SXin Li 117*67e74705SXin Li@end 118*67e74705SXin Li 119*67e74705SXin Li 120*67e74705SXin Livoid foo(void) 121*67e74705SXin Li{ 122*67e74705SXin Li void *fun; 123*67e74705SXin Li void *ptr; 124*67e74705SXin Li X r; 125*67e74705SXin Li A *im = [A create:(void (*)(void *cgl_ctx, X r, void *data)) fun 126*67e74705SXin Li callbackData:ptr]; 127*67e74705SXin Li} 128*67e74705SXin Li 129*67e74705SXin Li// <rdar://problem/8807070> 130*67e74705SXin Litemplate<typename T> struct X1; // expected-note{{template is declared here}} 131*67e74705SXin Li 132*67e74705SXin Li@interface B 133*67e74705SXin Li+ (X1<int>)blah; 134*67e74705SXin Li+ (X1<float>&)blarg; 135*67e74705SXin Li@end 136*67e74705SXin Li 137*67e74705SXin Livoid f() { 138*67e74705SXin Li [B blah]; // expected-error{{implicit instantiation of undefined template 'X1<int>'}} 139*67e74705SXin Li [B blarg]; 140*67e74705SXin Li} 141