Home | History | Annotate | Download | only in SemaObjC
      1 // RUN: %clang_cc1  -fsyntax-only -verify -Wno-objc-root-class %s
      2 // RUN: %clang_cc1 -x objective-c++ -fsyntax-only -verify -Wno-objc-root-class %s
      3 // RUN: %clang_cc1  -fsyntax-only -fobjc-arc -verify -Wno-objc-root-class %s
      4 // RUN: %clang_cc1 -x objective-c++ -fobjc-arc -fsyntax-only -verify -Wno-objc-root-class %s
      5 // rdar://6386358
      6 
      7 #if __has_attribute(objc_requires_super)
      8 #define  NS_REQUIRES_SUPER __attribute((objc_requires_super))
      9 #endif
     10 
     11 @protocol NSObject // expected-note {{protocol is declared here}}
     12 - MyDealloc NS_REQUIRES_SUPER; // expected-warning {{'objc_requires_super' attribute cannot be applied to methods in protocols}}
     13 @end
     14 
     15 @interface Root
     16 - MyDealloc __attribute((objc_requires_super));
     17 - (void)XXX __attribute((objc_requires_super));
     18 - (void) dealloc __attribute((objc_requires_super)); // expected-warning {{'objc_requires_super' attribute cannot be applied to dealloc}}
     19 - (void) MyDeallocMeth; // Method in root is not annotated.
     20 - (void) AnnotMyDeallocMeth __attribute((objc_requires_super));
     21 - (void) AnnotMyDeallocMethCAT NS_REQUIRES_SUPER; 
     22 
     23 + (void)registerClass:(id)name __attribute((objc_requires_super));
     24 @end
     25 
     26 @interface Baz : Root<NSObject>
     27 - MyDealloc;
     28 - (void) MyDeallocMeth __attribute((objc_requires_super)); // 'Baz' author has annotated method
     29 - (void) AnnotMyDeallocMeth; // Annotated in root but not here. Annotation is inherited though
     30 - (void) AnnotMeth __attribute((objc_requires_super)); // 'Baz' author has annotated method
     31 @end
     32 
     33 @implementation Baz
     34 -  MyDealloc {
     35    [super MyDealloc];
     36         return 0;
     37 }
     38 
     39 - (void)XXX {
     40   [super MyDealloc];
     41 } // expected-warning {{method possibly missing a [super XXX] call}}
     42 
     43 - (void) MyDeallocMeth {} // No warning here.
     44 - (void) AnnotMyDeallocMeth{} // expected-warning {{method possibly missing a [super AnnotMyDeallocMeth] call}}
     45 - (void) AnnotMeth{}; // No warning here. Annotation is in its class.
     46 
     47 + (void)registerClass:(id)name {} // expected-warning {{method possibly missing a [super registerClass:] call}}
     48 @end
     49 
     50 @interface Bar : Baz
     51 @end
     52 
     53 @implementation Bar
     54 - (void) MyDeallocMeth {} // expected-warning {{method possibly missing a [super MyDeallocMeth] call}}
     55 - (void) AnnotMyDeallocMeth{} // expected-warning {{method possibly missing a [super AnnotMyDeallocMeth] call}}
     56 - (void) AnnotMeth{};  // expected-warning {{method possibly missing a [super AnnotMeth] call}}
     57 @end
     58 
     59 @interface Bar(CAT) 
     60 - (void) AnnotMyDeallocMethCAT; // Annotated in root but not here. Annotation is inherited though
     61 - (void) AnnotMethCAT __attribute((objc_requires_super));
     62 @end
     63 
     64 @implementation Bar(CAT)
     65 - (void) MyDeallocMeth {} // expected-warning {{method possibly missing a [super MyDeallocMeth] call}}
     66 - (void) AnnotMyDeallocMeth{} // expected-warning {{method possibly missing a [super AnnotMyDeallocMeth] call}}
     67 - (void) AnnotMeth{};  // expected-warning {{method possibly missing a [super AnnotMeth] call}}
     68 - (void) AnnotMyDeallocMethCAT{}; // expected-warning {{method possibly missing a [super AnnotMyDeallocMethCAT] call}}
     69 - (void) AnnotMethCAT {};
     70 @end
     71 
     72 
     73 @interface Valid : Baz
     74 @end
     75 
     76 @implementation Valid
     77 
     78 - (void)MyDeallocMeth {
     79   [super MyDeallocMeth]; // no-warning
     80 }
     81 
     82 
     83 + (void)registerClass:(id)name {
     84   [super registerClass:name]; // no-warning
     85 }
     86 
     87 @end
     88