Home | History | Annotate | Download | only in Analysis
      1 // RUN: %clang_cc1 -fblocks -analyze -analyzer-checker=osx.cocoa.UnusedIvars -verify -Wno-objc-root-class %s
      2 
      3 //===--- BEGIN: Delta-debugging reduced headers. --------------------------===//
      4 
      5 @protocol NSObject
      6 - (id)retain;
      7 - (oneway void)release;
      8 @end
      9 @interface NSObject <NSObject> {}
     10 - (id)init;
     11 + (id)alloc;
     12 @end
     13 
     14 //===--- END: Delta-debugging reduced headers. ----------------------------===//
     15 
     16 // This test case tests the basic functionality of the unused ivar test.
     17 @interface TestA {
     18 @private
     19   int x; // expected-warning {{Instance variable 'x' in class 'TestA' is never used}}
     20 }
     21 @end
     22 @implementation TestA @end
     23 
     24 // This test case tests whether the unused ivar check handles blocks that
     25 // reference an instance variable. (<rdar://problem/7075531>)
     26 @interface TestB : NSObject {
     27 @private
     28   id _ivar; // no-warning
     29 }
     30 @property (readwrite,retain) id ivar;
     31 @end
     32 
     33 @implementation TestB
     34 - (id)ivar {
     35   __attribute__((__blocks__(byref))) id value = ((void*)0);
     36   void (^b)() = ^{ value = _ivar; };
     37   b();
     38   return value;
     39 }
     40 
     41 - (void)setIvar:(id)newValue {
     42   void (^b)() = ^{ [_ivar release]; _ivar = [newValue retain]; };
     43   b();
     44 }
     45 @end
     46 
     47 //===----------------------------------------------------------------------===//
     48 // <rdar://problem/6260004> Detect that ivar is in use, if used in category 
     49 //  in the same file as the implementation
     50 //===----------------------------------------------------------------------===//
     51 
     52 @protocol Protocol6260004
     53 - (id) getId;
     54 @end
     55 
     56 @interface RDar6260004 {
     57 @private
     58   id x; // no-warning
     59 }
     60 @end
     61 @implementation RDar6260004 @end
     62 @implementation RDar6260004 (Protocol6260004)
     63 - (id) getId {
     64   return x;
     65 }
     66 @end
     67 
     68 //===----------------------------------------------------------------------===//
     69 // <rdar://problem/7254495> - ivars referenced by lexically nested functions
     70 //  should not be flagged as unused
     71 //===----------------------------------------------------------------------===//
     72 
     73 @interface RDar7254495 {
     74 @private
     75   int x; // no-warning
     76 }
     77 @end
     78 
     79 @implementation RDar7254495
     80 int radar_7254495(RDar7254495 *a) {
     81   return a->x;
     82 }
     83 @end
     84 
     85 //===----------------------------------------------------------------------===//
     86 // <rdar://problem/7353683> - consult attribute((unused)) to silence warnings
     87 // about unused instance variables
     88 //===----------------------------------------------------------------------===//
     89 
     90 @interface RDar7353683 {
     91 @private
     92   id x __attribute__((unused));
     93 }
     94 @end
     95 
     96 @implementation RDar7353683
     97 @end
     98 //===----------------------------------------------------------------------===//
     99 // <rdar://problem/8481311> Unused bitfield ivars trigger cause weird
    100 // diagnostic: "Instance variable '' in class..."
    101 //===----------------------------------------------------------------------===//
    102 
    103 @interface RDar8481311 {
    104 @private
    105     unsigned bitfield:1; // expected-warning {{Instance variable 'bitfield' in class 'RDar8481311' is never used}}
    106 }
    107 @end
    108 
    109 @implementation RDar8481311
    110 @end
    111 
    112 @class NSString;
    113 @interface Radar11059352_1 {
    114 @private
    115     NSString *_pathString;
    116 }
    117 @property (readonly, strong) NSString *pathString;
    118 @end
    119 
    120 @interface Radar11059352 {
    121 @private
    122 Radar11059352_1 *_workspacePath;
    123 }
    124 @end
    125 
    126 @implementation Radar11059352
    127 
    128 - (void)useWorkspace {
    129     NSString *workspacePathString = _workspacePath.pathString;
    130 }
    131 @end