1*67e74705SXin Li// RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s 2*67e74705SXin Li@interface Foo 3*67e74705SXin Li@end 4*67e74705SXin Li 5*67e74705SXin Li@implementation Foo 6*67e74705SXin Li 7*67e74705SXin Livoid func(id); 8*67e74705SXin Li 9*67e74705SXin Li+ zone { 10*67e74705SXin Li func(self); 11*67e74705SXin Li return self; 12*67e74705SXin Li} 13*67e74705SXin Li@end 14*67e74705SXin Li 15*67e74705SXin Li@protocol P0 16*67e74705SXin Li@end 17*67e74705SXin Li 18*67e74705SXin Li@protocol P1 19*67e74705SXin Li@end 20*67e74705SXin Li 21*67e74705SXin Li@interface A <P0> 22*67e74705SXin Li@end 23*67e74705SXin Li 24*67e74705SXin Li@interface B : A 25*67e74705SXin Li@end 26*67e74705SXin Li 27*67e74705SXin Li@interface C <P1> 28*67e74705SXin Li@end 29*67e74705SXin Li 30*67e74705SXin Liint& f(A*); // expected-note {{candidate}} 31*67e74705SXin Lifloat& f(B*); // expected-note {{candidate}} 32*67e74705SXin Livoid g(A*); 33*67e74705SXin Li 34*67e74705SXin Liint& h(A*); 35*67e74705SXin Lifloat& h(id); 36*67e74705SXin Li 37*67e74705SXin Livoid test0(A* a, B* b, id val) { 38*67e74705SXin Li int& i1 = f(a); 39*67e74705SXin Li float& f1 = f(b); 40*67e74705SXin Li 41*67e74705SXin Li // GCC succeeds here, which is clearly ridiculous. 42*67e74705SXin Li float& f2 = f(val); // expected-error {{ambiguous}} 43*67e74705SXin Li 44*67e74705SXin Li g(a); 45*67e74705SXin Li g(b); 46*67e74705SXin Li g(val); 47*67e74705SXin Li int& i2 = h(a); 48*67e74705SXin Li float& f3 = h(val); 49*67e74705SXin Li 50*67e74705SXin Li int& i3 = h(b); 51*67e74705SXin Li} 52*67e74705SXin Li 53*67e74705SXin Livoid test1(A* a) { 54*67e74705SXin Li B* b = a; // expected-warning{{incompatible pointer types initializing 'B *' with an expression of type 'A *'}} 55*67e74705SXin Li B *c; c = a; // expected-warning{{incompatible pointer types assigning to 'B *' from 'A *'}} 56*67e74705SXin Li} 57*67e74705SXin Li 58*67e74705SXin Livoid test2(A** ap) { 59*67e74705SXin Li B** bp = ap; // expected-warning{{incompatible pointer types initializing 'B **' with an expression of type 'A **'}} 60*67e74705SXin Li bp = ap; // expected-warning{{incompatible pointer types assigning to 'B **' from 'A **'}} 61*67e74705SXin Li} 62*67e74705SXin Li 63*67e74705SXin Liint& cv(A*); 64*67e74705SXin Lifloat& cv(const A*); 65*67e74705SXin Li 66*67e74705SXin Liint& cv2(void*); 67*67e74705SXin Lifloat& cv2(const void*); 68*67e74705SXin Li 69*67e74705SXin Livoid cv_test(A* a, B* b, const A* ac, const B* bc) { 70*67e74705SXin Li int &i1 = cv(a); 71*67e74705SXin Li int &i2 = cv(b); 72*67e74705SXin Li float &f1 = cv(ac); 73*67e74705SXin Li float &f2 = cv(bc); 74*67e74705SXin Li int& i3 = cv2(a); 75*67e74705SXin Li float& f3 = cv2(ac); 76*67e74705SXin Li} 77*67e74705SXin Li 78*67e74705SXin Liint& qualid(id<P0>); 79*67e74705SXin Lifloat& qualid(id<P1>); 80*67e74705SXin Li 81*67e74705SXin Livoid qualid_test(A *a, B *b, C *c) { 82*67e74705SXin Li int& i1 = qualid(a); 83*67e74705SXin Li int& i2 = qualid(b); 84*67e74705SXin Li 85*67e74705SXin Li float& f1 = qualid(c); 86*67e74705SXin Li 87*67e74705SXin Li id<P0> p1 = 0; 88*67e74705SXin Li p1 = 0; 89*67e74705SXin Li} 90*67e74705SXin Li 91*67e74705SXin Li 92*67e74705SXin Li@class NSException; 93*67e74705SXin Litypedef struct { 94*67e74705SXin Li void (*throw_exc)(id); 95*67e74705SXin Li} 96*67e74705SXin Liobjc_exception_functions_t; 97*67e74705SXin Li 98*67e74705SXin Livoid (*_NSExceptionRaiser(void))(NSException *) { 99*67e74705SXin Li objc_exception_functions_t exc_funcs; 100*67e74705SXin Li return exc_funcs.throw_exc; // expected-warning{{incompatible pointer types returning 'void (*)(id)' from a function with result type 'void (*)(NSException *)'}} 101*67e74705SXin Li} 102*67e74705SXin Li 103*67e74705SXin Linamespace test5 { 104*67e74705SXin Li void foo(bool); 105*67e74705SXin Li void foo(void *); 106*67e74705SXin Li 107*67e74705SXin Li void test(id p) { 108*67e74705SXin Li foo(p); 109*67e74705SXin Li } 110*67e74705SXin Li} 111*67e74705SXin Li 112*67e74705SXin Li// rdar://problem/8592139 113*67e74705SXin Linamespace test6 { 114*67e74705SXin Li void foo(id); // expected-note{{candidate function}} 115*67e74705SXin Li void foo(A*) __attribute__((unavailable)); // expected-note {{explicitly made unavailable}} 116*67e74705SXin Li 117*67e74705SXin Li void test(B *b) { 118*67e74705SXin Li foo(b); // expected-error {{call to unavailable function 'foo'}} 119*67e74705SXin Li } 120*67e74705SXin Li} 121*67e74705SXin Li 122*67e74705SXin Linamespace rdar8714395 { 123*67e74705SXin Li int &f(const void*); 124*67e74705SXin Li float &f(const Foo*); 125*67e74705SXin Li 126*67e74705SXin Li int &f2(const void*); 127*67e74705SXin Li float &f2(Foo const* const *); 128*67e74705SXin Li 129*67e74705SXin Li int &f3(const void*); 130*67e74705SXin Li float &f3(Foo const**); 131*67e74705SXin Li 132*67e74705SXin Li void g(Foo *p) { 133*67e74705SXin Li float &fr = f(p); 134*67e74705SXin Li float &fr2 = f2(&p); 135*67e74705SXin Li int &ir = f3(&p); 136*67e74705SXin Li } 137*67e74705SXin Li 138*67e74705SXin Li 139*67e74705SXin Li} 140*67e74705SXin Li 141*67e74705SXin Linamespace rdar8734046 { 142*67e74705SXin Li void f1(id); 143*67e74705SXin Li void f2(id<P0>); 144*67e74705SXin Li void g(const A *a) { 145*67e74705SXin Li f1(a); 146*67e74705SXin Li f2(a); 147*67e74705SXin Li } 148*67e74705SXin Li} 149*67e74705SXin Li 150*67e74705SXin Linamespace PR9735 { 151*67e74705SXin Li int &f3(const A*); 152*67e74705SXin Li float &f3(const void*); 153*67e74705SXin Li 154*67e74705SXin Li void test_f(B* b, const B* bc) { 155*67e74705SXin Li int &ir1 = f3(b); 156*67e74705SXin Li int &ir2 = f3(bc); 157*67e74705SXin Li } 158*67e74705SXin Li} 159*67e74705SXin Li 160*67e74705SXin Li@interface D : B 161*67e74705SXin Li@end 162*67e74705SXin Li 163*67e74705SXin Linamespace rdar9327203 { 164*67e74705SXin Li int &f(void* const&, int); 165*67e74705SXin Li float &f(void* const&, long); 166*67e74705SXin Li 167*67e74705SXin Li void g(id x) { 168*67e74705SXin Li int &fr = (f)(x, 0); 169*67e74705SXin Li } 170*67e74705SXin Li} 171*67e74705SXin Li 172*67e74705SXin Linamespace class_id { 173*67e74705SXin Li // it's okay to overload Class with id. 174*67e74705SXin Li void f(Class) { } 175*67e74705SXin Li void f(id) { } 176*67e74705SXin Li} 177