1// RUN: %clang_cc1 -analyze -analyzer-checker=osx.cocoa.Dealloc -fblocks -verify %s
2// RUN: %clang_cc1 -analyze -analyzer-checker=osx.cocoa.Dealloc -fblocks -triple x86_64-apple-darwin10 -fobjc-arc -fobjc-runtime-has-weak -verify %s
3
4#include "Inputs/system-header-simulator-for-objc-dealloc.h"
5
6#define NON_ARC !__has_feature(objc_arc)
7
8#if NON_ARC
9#define WEAK_ON_ARC
10#else
11#define WEAK_ON_ARC __weak
12#endif
13
14// No diagnostics expected under ARC.
15#if !NON_ARC
16  // expected-no-diagnostics
17#endif
18
19// Do not warn about missing release in -dealloc for ivars.
20
21@interface MyIvarClass1 : NSObject {
22  NSObject *_ivar;
23}
24@end
25
26@implementation MyIvarClass1
27- (instancetype)initWithIvar:(NSObject *)ivar
28{
29  self = [super init];
30  if (!self)
31    return nil;
32#if NON_ARC
33  _ivar = [ivar retain];
34#endif
35  return self;
36}
37- (void)dealloc
38{
39#if NON_ARC
40  [super dealloc];
41#endif
42}
43@end
44
45@interface MyIvarClass2 : NSObject {
46  NSObject *_ivar;
47}
48- (NSObject *)ivar;
49- (void)setIvar:(NSObject *)ivar;
50@end
51
52@implementation MyIvarClass2
53- (instancetype)init
54{
55  self = [super init];
56  return self;
57}
58- (void)dealloc
59{
60#if NON_ARC
61  [super dealloc];
62#endif
63}
64- (NSObject *)ivar
65{
66  return _ivar;
67}
68- (void)setIvar:(NSObject *)ivar
69{
70#if NON_ARC
71  [_ivar release];
72  _ivar = [ivar retain];
73#else
74 _ivar = ivar;
75#endif
76}
77@end
78
79// Warn about missing release in -dealloc for properties.
80
81@interface MyPropertyClass1 : NSObject
82@property (copy) NSObject *ivar;
83@end
84
85@implementation MyPropertyClass1
86- (void)dealloc
87{
88#if NON_ARC
89  [super dealloc]; // expected-warning {{The '_ivar' ivar in 'MyPropertyClass1' was copied by a synthesized property but not released before '[super dealloc]'}}
90#endif
91}
92@end
93
94@interface MyPropertyClass2 : NSObject
95@property (retain) NSObject *ivar;
96@end
97
98@implementation MyPropertyClass2
99- (void)dealloc
100{
101#if NON_ARC
102  [super dealloc]; // expected-warning {{The '_ivar' ivar in 'MyPropertyClass2' was retained by a synthesized property but not released before '[super dealloc]'}}
103#endif
104}
105@end
106
107@interface MyPropertyClass3 : NSObject {
108  NSObject *_ivar;
109}
110@property (retain) NSObject *ivar;
111@end
112
113@implementation MyPropertyClass3
114@synthesize ivar = _ivar;
115- (void)dealloc
116{
117#if NON_ARC
118  [super dealloc]; // expected-warning {{The '_ivar' ivar in 'MyPropertyClass3' was retained by a synthesized property but not released before '[super dealloc]'}}
119#endif
120}
121
122@end
123
124@interface MyPropertyClass4 : NSObject {
125  void (^_blockPropertyIvar)(void);
126}
127@property (copy) void (^blockProperty)(void);
128@property (copy) void (^blockProperty2)(void);
129@property (copy) void (^blockProperty3)(void);
130
131@end
132
133@implementation MyPropertyClass4
134@synthesize blockProperty = _blockPropertyIvar;
135- (void)dealloc
136{
137#if NON_ARC
138  [_blockProperty2 release];
139  Block_release(_blockProperty3);
140
141  [super dealloc]; // expected-warning {{The '_blockPropertyIvar' ivar in 'MyPropertyClass4' was copied by a synthesized property but not released before '[super dealloc]'}}
142#endif
143}
144@end
145
146@interface MyPropertyClass5 : NSObject {
147  WEAK_ON_ARC NSObject *_ivar;
148}
149@property (weak) NSObject *ivar;
150@end
151
152@implementation MyPropertyClass5
153@synthesize ivar = _ivar;
154- (void)dealloc
155{
156#if NON_ARC
157  [super dealloc]; // no-warning because it is a weak property
158#endif
159}
160@end
161
162@interface MyPropertyClassWithReturnInDealloc : NSObject {
163  NSObject *_ivar;
164}
165@property (retain) NSObject *ivar;
166@end
167
168@implementation MyPropertyClassWithReturnInDealloc
169@synthesize ivar = _ivar;
170- (void)dealloc
171{
172  return;
173#if NON_ARC
174  // expected-warning@-2{{The '_ivar' ivar in 'MyPropertyClassWithReturnInDealloc' was retained by a synthesized property but not released before '[super dealloc]'}}
175  [super dealloc];
176#endif
177}
178@end
179
180@interface MyPropertyClassWithReleaseInOtherInstance : NSObject {
181  NSObject *_ivar;
182  MyPropertyClassWithReleaseInOtherInstance *_other;
183}
184@property (retain) NSObject *ivar;
185
186-(void)releaseIvars;
187@end
188
189@implementation MyPropertyClassWithReleaseInOtherInstance
190@synthesize ivar = _ivar;
191
192-(void)releaseIvars; {
193#if NON_ARC
194  [_ivar release];
195#endif
196}
197
198- (void)dealloc
199{
200  [_other releaseIvars];
201#if NON_ARC
202  [super dealloc]; // expected-warning {{The '_ivar' ivar in 'MyPropertyClassWithReleaseInOtherInstance' was retained by a synthesized property but not released before '[super dealloc]'}}
203#endif
204}
205@end
206
207@interface MyPropertyClassWithNeitherReturnNorSuperDealloc : NSObject {
208  NSObject *_ivar;
209}
210@property (retain) NSObject *ivar;
211@end
212
213@implementation MyPropertyClassWithNeitherReturnNorSuperDealloc
214@synthesize ivar = _ivar;
215- (void)dealloc
216{
217}
218#if NON_ARC
219  // expected-warning@-2 {{method possibly missing a [super dealloc] call}} (From Sema)
220  // expected-warning@-3{{The '_ivar' ivar in 'MyPropertyClassWithNeitherReturnNorSuperDealloc' was retained by a synthesized property but not released before '[super dealloc]'}}
221#endif
222@end
223
224// <rdar://problem/6380411>: 'myproperty' has kind 'assign' and thus the
225//  assignment through the setter does not perform a release.
226
227@interface MyObject : NSObject {
228  id __unsafe_unretained _myproperty;
229}
230@property(assign) id myproperty;
231@end
232
233@implementation MyObject
234@synthesize myproperty=_myproperty; // no-warning
235- (void)dealloc {
236  // Don't claim that myproperty is released since it the property
237  // has the 'assign' attribute.
238  self.myproperty = 0; // no-warning
239#if NON_ARC
240  [super dealloc];
241#endif
242}
243@end
244
245@interface ClassWithControlFlowInRelease : NSObject {
246  BOOL _ivar1;
247}
248@property (retain) NSObject *ivar2;
249@end
250
251@implementation ClassWithControlFlowInRelease
252- (void)dealloc; {
253  if (_ivar1) {
254    // We really should warn because there is a path through -dealloc on which
255    // _ivar2 is not released.
256#if NON_ARC
257    [_ivar2 release];
258#endif
259  }
260
261#if NON_ARC
262  [super dealloc]; // expected-warning {{The '_ivar2' ivar in 'ClassWithControlFlowInRelease' was retained by a synthesized property but not released before '[super dealloc]'}}
263#endif
264}
265@end
266
267// Don't warn when the property is nil'd out in -dealloc
268
269@interface ClassWithNildOutProperty : NSObject
270@property (retain) NSObject *ivar;
271@property (assign) int *intPtrProp;
272@end
273
274@implementation ClassWithNildOutProperty
275- (void)dealloc; {
276  self.ivar = nil;
277
278  // Make sure to handle setting a non-retainable property to 0.
279  self.intPtrProp = 0;
280#if NON_ARC
281  [super dealloc];  // no-warning
282#endif
283}
284@end
285
286// Do warn when the ivar but not the property is nil'd out in -dealloc
287
288@interface ClassWithNildOutIvar : NSObject
289@property (retain) NSObject *ivar;
290@end
291
292@implementation ClassWithNildOutIvar
293- (void)dealloc; {
294  // Oops. Meant self.ivar = nil
295  _ivar = nil;
296
297#if NON_ARC
298  [super dealloc]; // expected-warning {{The '_ivar' ivar in 'ClassWithNildOutIvar' was retained by a synthesized property but not released before '[super dealloc]'}}
299#endif
300}
301@end
302
303// Do warn when the ivar is updated to a different value that is then
304// released.
305
306@interface ClassWithUpdatedIvar : NSObject
307@property (retain) NSObject *ivar;
308@end
309
310@implementation ClassWithUpdatedIvar
311- (void)dealloc; {
312  _ivar = [[NSObject alloc] init];
313
314#if NON_ARC
315  [_ivar release];
316#endif
317
318#if NON_ARC
319  [super dealloc]; // expected-warning {{The '_ivar' ivar in 'ClassWithUpdatedIvar' was retained by a synthesized property but not released before '[super dealloc]'}}
320#endif
321}
322@end
323
324
325// Don't warn when the property is nil'd out with a setter in -dealloc
326
327@interface ClassWithNildOutPropertyViaSetter : NSObject
328@property (retain) NSObject *ivar;
329@end
330
331@implementation ClassWithNildOutPropertyViaSetter
332- (void)dealloc; {
333  [self setIvar:nil];
334
335#if NON_ARC
336  [super dealloc];  // no-warning
337#endif
338}
339@end
340
341
342// Don't warn about missing releases when -dealloc helpers are called.
343
344@interface ClassWithDeallocHelpers : NSObject
345@property (retain) NSObject *ivarReleasedInMethod;
346@property (retain) NSObject *propNilledOutInMethod;
347
348@property (retain) NSObject *ivarReleasedInFunction;
349@property (retain) NSObject *propNilledOutInFunction;
350
351@property (retain) NSObject *ivarNeverReleased;
352- (void)invalidateInMethod;
353@end
354
355void ReleaseValueHelper(NSObject *iv) {
356#if NON_ARC
357  [iv release];
358#endif
359}
360
361void NilOutPropertyHelper(ClassWithDeallocHelpers *o) {
362  o.propNilledOutInFunction = nil;
363}
364
365@implementation ClassWithDeallocHelpers
366- (void)invalidateInMethod {
367#if NON_ARC
368  [_ivarReleasedInMethod release];
369#endif
370  self.propNilledOutInMethod = nil;
371}
372
373- (void)dealloc; {
374  ReleaseValueHelper(_ivarReleasedInFunction);
375  NilOutPropertyHelper(self);
376
377  [self invalidateInMethod];
378#if NON_ARC
379  [super dealloc]; // expected-warning {{The '_ivarNeverReleased' ivar in 'ClassWithDeallocHelpers' was retained by a synthesized property but not released before '[super dealloc]'}}
380#endif
381}
382@end
383
384
385// Don't warn when self in -dealloc escapes.
386
387@interface ClassWhereSelfEscapesViaMethodCall : NSObject
388@property (retain) NSObject *ivar;  // no-warning
389@end
390
391@interface ClassWhereSelfEscapesViaMethodCall (Other)
392- (void)invalidate; // In other translation unit.
393@end
394
395@implementation ClassWhereSelfEscapesViaMethodCall
396- (void)dealloc; {
397  [self invalidate];
398#if NON_ARC
399  [super dealloc];
400#endif
401} // no-warning
402@end
403
404@interface ClassWhereSelfEscapesViaPropertyAccess : NSObject
405@property (retain) NSObject *ivar;
406@end
407
408@interface ClassWhereSelfEscapesViaPropertyAccess (Other)
409// The implementation of this property is unknown and therefore could
410// release ivar.
411@property (retain) NSObject *otherIvar;
412@end
413
414@implementation ClassWhereSelfEscapesViaPropertyAccess
415- (void)dealloc; {
416  self.otherIvar = nil;
417#if NON_ARC
418  [super dealloc];
419#endif
420} // no-warning
421@end
422
423// Don't treat self as escaping when setter called on *synthesized*
424// property.
425
426@interface ClassWhereSelfEscapesViaSynthesizedPropertyAccess : NSObject
427@property (retain) NSObject *ivar;
428@property (retain) NSObject *otherIvar;
429@end
430
431@implementation ClassWhereSelfEscapesViaSynthesizedPropertyAccess
432- (void)dealloc; {
433  self.otherIvar = nil;
434#if NON_ARC
435  [super dealloc];  // expected-warning {{The '_ivar' ivar in 'ClassWhereSelfEscapesViaSynthesizedPropertyAccess' was retained by a synthesized property but not released before '[super dealloc]'}}
436#endif
437}
438@end
439
440
441// Don't treat calls to system headers as escapes
442
443@interface ClassWhereSelfEscapesViaCallToSystem : NSObject
444@property (retain) NSObject *ivar1;
445@property (retain) NSObject *ivar2;
446@property (retain) NSObject *ivar3;
447@property (retain) NSObject *ivar4;
448@property (retain) NSObject *ivar5;
449@property (retain) NSObject *ivar6;
450@end
451
452@implementation ClassWhereSelfEscapesViaCallToSystem
453- (void)dealloc; {
454#if NON_ARC
455  [_ivar2 release];
456  if (_ivar3) {
457    [_ivar3 release];
458  }
459#endif
460
461  [[NSRunLoop currentRunLoop] cancelPerformSelectorsWithTarget:self];
462  [[NSNotificationCenter defaultCenter] removeObserver:self];
463
464#if NON_ARC
465  [_ivar4 release];
466
467  if (_ivar5) {
468    [_ivar5 release];
469  }
470#endif
471
472  [[NSNotificationCenter defaultCenter] removeObserver:self];
473
474#if NON_ARC
475  if (_ivar6) {
476    [_ivar6 release];
477  }
478
479  [super dealloc];  // expected-warning {{The '_ivar1' ivar in 'ClassWhereSelfEscapesViaCallToSystem' was retained by a synthesized property but not released before '[super dealloc]'}}
480#endif
481}
482@end
483
484// Don't warn when value escapes.
485
486@interface ClassWhereIvarValueEscapes : NSObject
487@property (retain) NSObject *ivar;
488@end
489
490void ReleaseMe(id arg);
491
492@implementation ClassWhereIvarValueEscapes
493- (void)dealloc; {
494
495  ReleaseMe(_ivar);
496
497#if NON_ARC
498  [super dealloc];
499#endif
500} // no-warning
501@end
502
503// Don't warn when value is known to be nil.
504
505@interface ClassWhereIvarIsNil : NSObject
506@property (retain) NSObject *ivarIsNil;
507@end
508
509@implementation ClassWhereIvarIsNil
510- (void)dealloc; {
511
512#if NON_ARC
513  if (_ivarIsNil)
514    [_ivarIsNil release];
515
516  [super dealloc];
517#endif
518} // no-warning
519@end
520
521
522// Don't warn for non-retainable properties.
523
524@interface ClassWithNonRetainableProperty : NSObject
525@property (assign) int *ivar;  // no-warning
526@end
527
528@implementation ClassWithNonRetainableProperty
529- (void)dealloc; {
530#if NON_ARC
531  [super dealloc];
532#endif
533} // no-warning
534@end
535
536
537@interface SuperClassOfClassWithInlinedSuperDealloc : NSObject
538@property (retain) NSObject *propInSuper;
539@end
540
541@implementation SuperClassOfClassWithInlinedSuperDealloc
542- (void)dealloc {
543#if NON_ARC
544  [super dealloc]; // expected-warning {{The '_propInSuper' ivar in 'SuperClassOfClassWithInlinedSuperDealloc' was retained by a synthesized property but not released before '[super dealloc]'}}
545#endif
546}
547@end
548
549@interface ClassWithInlinedSuperDealloc : SuperClassOfClassWithInlinedSuperDealloc
550@property (retain) NSObject *propInSub;
551@end
552
553@implementation ClassWithInlinedSuperDealloc
554- (void)dealloc {
555#if NON_ARC
556  [super dealloc]; // expected-warning {{The '_propInSub' ivar in 'ClassWithInlinedSuperDealloc' was retained by a synthesized property but not released before '[super dealloc]'}}
557#endif
558}
559@end
560
561
562@interface SuperClassOfClassWithInlinedSuperDeallocAndInvalidation : NSObject
563@property (retain) NSObject *propInSuper;
564
565- (void)invalidate;
566@end
567
568@implementation SuperClassOfClassWithInlinedSuperDeallocAndInvalidation
569
570- (void)invalidate {
571#if NON_ARC
572  [_propInSuper release];
573#endif
574  _propInSuper = nil;
575}
576
577- (void)dealloc {
578  [self invalidate];
579#if NON_ARC
580  [super dealloc]; // no-warning
581#endif
582}
583@end
584
585@interface ClassWithInlinedSuperDeallocAndInvalidation : SuperClassOfClassWithInlinedSuperDeallocAndInvalidation
586@property (retain) NSObject *propInSub;
587@end
588
589@implementation ClassWithInlinedSuperDeallocAndInvalidation
590
591- (void)invalidate {
592#if NON_ARC
593  [_propInSub release];
594#endif
595  [super invalidate];
596}
597
598- (void)dealloc {
599#if NON_ARC
600  [super dealloc]; // no-warning
601#endif
602}
603@end
604
605
606@interface SuperClassOfClassThatEscapesBeforeInliningSuper : NSObject
607@property (retain) NSObject *propInSuper;
608@end
609
610@implementation SuperClassOfClassThatEscapesBeforeInliningSuper
611
612- (void)dealloc {
613
614#if NON_ARC
615  [super dealloc]; // expected-warning {{The '_propInSuper' ivar in 'SuperClassOfClassThatEscapesBeforeInliningSuper' was retained by a synthesized property but not released before '[super dealloc]'}}
616#endif
617}
618@end
619
620@interface ClassThatEscapesBeforeInliningSuper : SuperClassOfClassThatEscapesBeforeInliningSuper
621@property (retain) NSObject *propInSub;
622@end
623
624@interface ClassThatEscapesBeforeInliningSuper (Other)
625- (void)invalidate; // No implementation in translation unit.
626@end
627
628@implementation ClassThatEscapesBeforeInliningSuper
629- (void)dealloc {
630  [self invalidate];
631
632#if NON_ARC
633  [super dealloc]; // no-warning
634#endif
635}
636@end
637
638
639#if NON_ARC
640@interface ReleaseIvarInField : NSObject {
641  int _tag;
642  union {
643    NSObject *field1;
644    NSObject *field2;
645  } _someUnion;
646
647  struct {
648    NSObject *field1;
649  } _someStruct;
650}
651@end
652
653@implementation ReleaseIvarInField
654- (void)dealloc {
655  if (_tag) {
656    [_someUnion.field1 release];
657  } else {
658    [_someUnion.field2 release];
659  }
660
661  [_someStruct.field1 release];
662  [super dealloc];
663}
664@end
665#endif
666
667struct SomeStruct {
668  int f;
669};
670@interface ZeroOutStructWithSetter : NSObject
671  @property(assign) struct SomeStruct s;
672@end
673
674@implementation ZeroOutStructWithSetter
675- (void)dealloc {
676  struct SomeStruct zeroedS;
677  zeroedS.f = 0;
678
679  self.s = zeroedS;
680#if NON_ARC
681  [super dealloc];
682#endif
683}
684@end
685
686#if NON_ARC
687@interface ReleaseIvarInArray : NSObject {
688  NSObject *_array[3];
689}
690@end
691
692@implementation ReleaseIvarInArray
693- (void)dealloc {
694  for (int i = 0; i < 3; i++) {
695    [_array[i] release];
696  }
697  [super dealloc];
698}
699@end
700#endif
701
702// Don't warn about missing releases for subclasses of SenTestCase or
703// for classes that are not subclasses of NSObject.
704
705@interface SenTestCase : NSObject {}
706@end
707
708@interface MyClassTest : SenTestCase
709@property (retain) NSObject *ivar;
710@end
711
712@implementation MyClassTest
713-(void)tearDown {
714#if NON_ARC
715  [_ivar release];
716#endif
717}
718
719-(void)dealloc; {
720#if NON_ARC
721  [super dealloc]; // no-warning
722#endif
723}
724@end
725
726@interface XCTestCase : NSObject {}
727@end
728
729@interface MyClassXCTest : XCTestCase
730@property (retain) NSObject *ivar;
731@end
732
733@implementation MyClassXCTest
734-(void)tearDown {
735#if NON_ARC
736  [_ivar release];
737#endif
738}
739
740-(void)dealloc; {
741#if NON_ARC
742  [super dealloc]; // no-warning
743#endif
744}
745@end
746
747
748__attribute__((objc_root_class))
749@interface NonNSObjectMissingDealloc
750@property (retain) NSObject *ivar;
751@end
752@implementation NonNSObjectMissingDealloc
753-(void)dealloc; {
754
755}
756@end
757
758// Warn about calling -dealloc rather than release by mistake.
759
760@interface CallDeallocOnRetainPropIvar : NSObject {
761  NSObject *okToDeallocDirectly;
762}
763
764@property (retain) NSObject *ivar;
765@end
766
767@implementation CallDeallocOnRetainPropIvar
768- (void)dealloc
769{
770#if NON_ARC
771  // Only warn for synthesized ivars.
772  [okToDeallocDirectly dealloc]; // no-warning
773  [_ivar dealloc];  // expected-warning {{'_ivar' should be released rather than deallocated}}
774
775  [super dealloc];
776#endif
777}
778@end
779
780// CIFilter special cases.
781// By design, -[CIFilter dealloc] releases (by calling -setValue: forKey: with
782// 'nil') all ivars (even in its *subclasses*) with names starting with
783// 'input' or that are backed by properties with names starting with 'input'.
784// The Dealloc checker needs to take particular care to not warn about missing
785// releases in this case -- if the user adds a release quiet the
786// warning it may result in an over release.
787
788@interface ImmediateSubCIFilter : CIFilter {
789  NSObject *inputIvar;
790  NSObject *nonInputIvar;
791  NSObject *notPrefixedButBackingPrefixedProperty;
792  NSObject *inputPrefixedButBackingNonPrefixedProperty;
793}
794
795@property(retain) NSObject *inputIvar;
796@property(retain) NSObject *nonInputIvar;
797@property(retain) NSObject *inputAutoSynthesizedIvar;
798@property(retain) NSObject *inputExplicitlySynthesizedToNonPrefixedIvar;
799@property(retain) NSObject *nonPrefixedPropertyBackedByExplicitlySynthesizedPrefixedIvar;
800
801@end
802
803@implementation ImmediateSubCIFilter
804@synthesize inputIvar = inputIvar;
805@synthesize nonInputIvar = nonInputIvar;
806@synthesize inputExplicitlySynthesizedToNonPrefixedIvar = notPrefixedButBackingPrefixedProperty;
807@synthesize nonPrefixedPropertyBackedByExplicitlySynthesizedPrefixedIvar = inputPrefixedButBackingNonPrefixedProperty;
808
809- (void)dealloc {
810#if NON_ARC
811  // We don't want warnings here for:
812  // inputIvar
813  // inputAutoSynthesizedIvar
814  // inputExplicitlySynthesizedToNonPrefixedIvar
815  // inputPrefixedButBackingNonPrefixedProperty
816  [super dealloc];
817  // expected-warning@-1 {{The 'nonInputIvar' ivar in 'ImmediateSubCIFilter' was retained by a synthesized property but not released before '[super dealloc]'}}
818#endif
819}
820@end
821
822@interface SubSubCIFilter : CIFilter {
823  NSObject *inputIvarInSub;
824}
825
826@property(retain) NSObject *inputIvarInSub;
827@end
828
829@implementation SubSubCIFilter
830@synthesize inputIvarInSub = inputIvarInSub;
831
832- (void)dealloc {
833// Don't warn about inputIvarInSub.
834#if NON_ARC
835  [super dealloc];
836#endif
837}
838@end
839@interface OverreleasingCIFilter : CIFilter {
840  NSObject *inputIvar;
841}
842
843@property(retain) NSObject *inputIvar;
844@end
845
846@implementation OverreleasingCIFilter
847@synthesize inputIvar = inputIvar;
848
849- (void)dealloc {
850#if NON_ARC
851  // This is an over release because CIFilter's dealloc will also release it.
852  [inputIvar release]; // expected-warning {{The 'inputIvar' ivar in 'OverreleasingCIFilter' will be released by '-[CIFilter dealloc]' but also released here}}
853  [super dealloc]; // no-warning
854  #endif
855}
856@end
857
858
859@interface NotMissingDeallocCIFilter : CIFilter {
860  NSObject *inputIvar;
861}
862
863@property(retain) NSObject *inputIvar;
864@end
865
866@implementation NotMissingDeallocCIFilter // no-warning
867@synthesize inputIvar = inputIvar;
868@end
869