Home | History | Annotate | Download | only in SemaObjCXX
      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