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