1*67e74705SXin Li// RUN: %clang_cc1 -fsyntax-only -verify %s 2*67e74705SXin Li 3*67e74705SXin Li@protocol P0 4*67e74705SXin Li@end 5*67e74705SXin Li@protocol P1 6*67e74705SXin Li@end 7*67e74705SXin Li@protocol P2 8*67e74705SXin Li@end 9*67e74705SXin Li 10*67e74705SXin Li@interface A <P0> 11*67e74705SXin Li@end 12*67e74705SXin Li 13*67e74705SXin Li@interface B : A 14*67e74705SXin Li@end 15*67e74705SXin Li 16*67e74705SXin Livoid bar(id x); 17*67e74705SXin Livoid barP0(id<P0> x); 18*67e74705SXin Livoid barP1(id<P1> x); 19*67e74705SXin Livoid barP2(id<P2> x); 20*67e74705SXin Li 21*67e74705SXin Livoid f0(A *a) { 22*67e74705SXin Li id l = a; 23*67e74705SXin Li} 24*67e74705SXin Li 25*67e74705SXin Livoid f1(id x, A *a) { 26*67e74705SXin Li id<P0> l = a; 27*67e74705SXin Li} 28*67e74705SXin Li 29*67e74705SXin Livoid f2(id<P1> x) { 30*67e74705SXin Li id<P0> l = x; // expected-warning {{initializing 'id<P0>' with an expression of incompatible type 'id<P1>'}} 31*67e74705SXin Li} 32*67e74705SXin Li 33*67e74705SXin Livoid f3(A *a) { 34*67e74705SXin Li id<P1> l = a; // expected-warning {{initializing 'id<P1>' with an expression of incompatible type 'A *'}} 35*67e74705SXin Li} 36*67e74705SXin Li 37*67e74705SXin Livoid f4(int cond, id x, A *a) { 38*67e74705SXin Li bar(cond ? x : a); 39*67e74705SXin Li} 40*67e74705SXin Li 41*67e74705SXin Livoid f5(int cond, A *a, B *b) { 42*67e74705SXin Li bar(cond ? a : b); 43*67e74705SXin Li} 44*67e74705SXin Li 45*67e74705SXin Livoid f6(int cond, id x, A *a) { 46*67e74705SXin Li bar(cond ? (id<P0, P1>) x : a); 47*67e74705SXin Li} 48*67e74705SXin Li 49*67e74705SXin Livoid f7(int cond, id x, A *a) { 50*67e74705SXin Li bar(cond ? a : (id<P0, P1>) x); 51*67e74705SXin Li} 52*67e74705SXin Li 53*67e74705SXin Livoid f8(int cond, id<P0,P1> x0, id<P0,P2> x1) { 54*67e74705SXin Li barP0(cond ? x0 : x1); // expected-warning {{incompatible operand types ('id<P0,P1>' and 'id<P0,P2>')}} 55*67e74705SXin Li} 56*67e74705SXin Li 57*67e74705SXin Livoid f9(int cond, id<P0,P1> x0, id<P0,P2> x1) { 58*67e74705SXin Li barP1(cond ? x0 : x1); // expected-warning {{incompatible operand types ('id<P0,P1>' and 'id<P0,P2>')}} 59*67e74705SXin Li} 60*67e74705SXin Li 61*67e74705SXin Livoid f10(int cond, id<P0,P1> x0, id<P0,P2> x1) { 62*67e74705SXin Li barP2(cond ? x0 : x1); // expected-warning {{incompatible operand types ('id<P0,P1>' and 'id<P0,P2>')}} 63*67e74705SXin Li} 64*67e74705SXin Li 65*67e74705SXin Liint f11(int cond, A* a, B* b) { 66*67e74705SXin Li return (cond? b : a)->x; // expected-error{{'A' does not have a member named 'x'}} 67*67e74705SXin Li} 68