// RUN: %clang_cc1 -std=c++11 -fsyntax-only %s -verify @interface A - knownMethod; @end @interface B - unknownMethod; @end @interface C : A - knownMethod; @end template<typename T> struct RetainPtr { explicit operator T*() const; }; void methodCallToSpecific(RetainPtr<A> a) { [a knownMethod]; [a unknownMethod]; // expected-warning{{'A' may not respond to 'unknownMethod'}} } void explicitCast(RetainPtr<A> a, RetainPtr<B> b, RetainPtr<C> c) { (void)(A*)a; (void)(A*)b; // expected-error{{cannot convert 'RetainPtr<B>' to 'A *' without a conversion operator}} (void)(A*)c; (void)(C*)a; (void)static_cast<A*>(a); (void)static_cast<A*>(b); // expected-error{{cannot convert 'RetainPtr<B>' to 'A *' without a conversion operator}} (void)static_cast<A*>(c); } struct Incomplete; // expected-note{{forward declaration}} void methodCallToIncomplete(Incomplete &incomplete) { [incomplete knownMethod]; // expected-error{{incomplete receiver type 'Incomplete'}} } struct IdPtr { explicit operator id() const; }; void methodCallToId(IdPtr a) { [a knownMethod]; [a unknownMethod]; } void explicitCast(IdPtr a) { (void)(A*)a; (void)static_cast<A*>(a); }