| // 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); |
| } |