1*67e74705SXin Li// RUN: %clang_cc1 -std=c++11 -fsyntax-only %s -verify 2*67e74705SXin Li 3*67e74705SXin Li@interface A 4*67e74705SXin Li- knownMethod; 5*67e74705SXin Li@end 6*67e74705SXin Li 7*67e74705SXin Li@interface B 8*67e74705SXin Li- unknownMethod; 9*67e74705SXin Li@end 10*67e74705SXin Li 11*67e74705SXin Li@interface C : A 12*67e74705SXin Li- knownMethod; 13*67e74705SXin Li@end 14*67e74705SXin Li 15*67e74705SXin Litemplate<typename T> struct RetainPtr { 16*67e74705SXin Li explicit operator T*() const; 17*67e74705SXin Li}; 18*67e74705SXin Li 19*67e74705SXin Livoid methodCallToSpecific(RetainPtr<A> a) { 20*67e74705SXin Li [a knownMethod]; 21*67e74705SXin Li [a unknownMethod]; // expected-warning{{'A' may not respond to 'unknownMethod'}} 22*67e74705SXin Li} 23*67e74705SXin Li 24*67e74705SXin Livoid explicitCast(RetainPtr<A> a, RetainPtr<B> b, RetainPtr<C> c) { 25*67e74705SXin Li (void)(A*)a; 26*67e74705SXin Li (void)(A*)b; // expected-error{{cannot convert 'RetainPtr<B>' to 'A *' without a conversion operator}} 27*67e74705SXin Li (void)(A*)c; 28*67e74705SXin Li (void)(C*)a; 29*67e74705SXin Li (void)static_cast<A*>(a); 30*67e74705SXin Li (void)static_cast<A*>(b); // expected-error{{cannot convert 'RetainPtr<B>' to 'A *' without a conversion operator}} 31*67e74705SXin Li (void)static_cast<A*>(c); 32*67e74705SXin Li} 33*67e74705SXin Li 34*67e74705SXin Listruct Incomplete; // expected-note{{forward declaration}} 35*67e74705SXin Li 36*67e74705SXin Livoid methodCallToIncomplete(Incomplete &incomplete) { 37*67e74705SXin Li [incomplete knownMethod]; // expected-error{{incomplete receiver type 'Incomplete'}} 38*67e74705SXin Li} 39*67e74705SXin Li 40*67e74705SXin Listruct IdPtr { 41*67e74705SXin Li explicit operator id() const; 42*67e74705SXin Li}; 43*67e74705SXin Li 44*67e74705SXin Livoid methodCallToId(IdPtr a) { 45*67e74705SXin Li [a knownMethod]; 46*67e74705SXin Li [a unknownMethod]; 47*67e74705SXin Li} 48*67e74705SXin Li 49*67e74705SXin Livoid explicitCast(IdPtr a) { 50*67e74705SXin Li (void)(A*)a; 51*67e74705SXin Li (void)static_cast<A*>(a); 52*67e74705SXin Li} 53