Home | History | Annotate | Download | only in SemaObjC
      1 // RUN: %clang_cc1 %s -fsyntax-only -verify 
      2 // RUN: %clang_cc1 -x objective-c++ %s -fsyntax-only -verify 
      3 
      4 // rdar://6497242 Inherited overridden protocol declared objects don't work
      5 // rdar://9740328 Case for c++
      6 
      7 @protocol NSObject @end
      8 @interface NSObject @end
      9 
     10 @protocol FooDelegate<NSObject>
     11 @optional
     12 - (void)fooTask;
     13 @end
     14 
     15 @protocol BarDelegate<NSObject, FooDelegate>
     16 @optional
     17 - (void)barTask;
     18 @end
     19 
     20 @interface Foo : NSObject {
     21   id _delegate;
     22 }
     23 @property(nonatomic, assign) id<FooDelegate> delegate;
     24 @property(nonatomic, assign) id<BarDelegate> delegate2; // expected-note {{property declared here}}
     25 @end
     26 @interface Bar : Foo {
     27 }
     28 @property(nonatomic, assign) id<BarDelegate> delegate;
     29 @property(nonatomic, assign) id<FooDelegate> delegate2; // expected-warning{{property type 'id<FooDelegate>' is incompatible with type 'id<BarDelegate>' inherited from 'Foo'}}
     30 @end
     31 
     32 @interface NSData @end
     33 
     34 @interface NSMutableData : NSData @end
     35 
     36 @interface Base : NSData 
     37 @property(assign) id ref;
     38 @property(assign) Base *p_base;
     39 @property(assign) NSMutableData *p_data;	 // expected-note {{property declared here}}
     40 @end
     41 
     42 @interface Data : Base 
     43 @property(assign) NSData *ref;	
     44 @property(assign) Data *p_base;	
     45 @property(assign) NSData *p_data;	// expected-warning{{property type 'NSData *' is incompatible with type 'NSMutableData *' inherited from 'Base'}}
     46 @end
     47 
     48 // rdar://15967517
     49 @protocol P1
     50 @property (nonatomic) void* selected;
     51 @end
     52 
     53 @protocol P2
     54 @property (nonatomic) void* selected; // expected-note {{property declared here}}
     55 @end
     56 
     57 @interface MKAnnotationView <P1>
     58 @property (nonatomic) void* selected; // expected-note {{property declared here}}
     59 @property (nonatomic) char selected2;
     60 @end
     61 
     62 @interface Parent : MKAnnotationView <P2>
     63 @property (nonatomic) void* selected1; // expected-note {{property declared here}}
     64 @property (nonatomic) char selected2;
     65 @end
     66 
     67 @interface Child : Parent
     68 @property (nonatomic) char selected; // expected-warning {{property type 'char' is incompatible with type 'void *' inherited from 'MKAnnotationView'}} \
     69 				     // expected-warning {{property type 'char' is incompatible with type 'void *' inherited from 'P2'}}
     70 @property (nonatomic) char selected1; // expected-warning {{property type 'char' is incompatible with type 'void *' inherited from 'Parent'}}
     71 @property (nonatomic) char selected2;
     72 @end
     73