// RUN: %clang_cc1 -std=c++11 -fsyntax-only %s -verify @interface A - knownMethod; @end @interface B - unknownMethod; @end @interface C : A - knownMethod; @end template struct RetainPtr { explicit operator T*() const; }; void methodCallToSpecific(RetainPtr a) { [a knownMethod]; [a unknownMethod]; // expected-warning{{'A' may not respond to 'unknownMethod'}} } void explicitCast(RetainPtr a, RetainPtr b, RetainPtr c) { (void)(A*)a; (void)(A*)b; // expected-error{{cannot convert 'RetainPtr' to 'A *' without a conversion operator}} (void)(A*)c; (void)(C*)a; (void)static_cast(a); (void)static_cast(b); // expected-error{{cannot convert 'RetainPtr' to 'A *' without a conversion operator}} (void)static_cast(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); }