[clang-cl] Ignore /Wv and /Wv:17 flags
[llvm-project.git] / clang / test / Analysis / DeallocMissingRelease.m
blob91af2bd0a231fb3becea85bcfb33d2a1dc7a4b2b
1 // RUN: %clang_analyze_cc1 -analyzer-checker=osx.cocoa.Dealloc -fblocks -triple x86_64-apple-ios4.0 -DMACOS=0 -verify %s
2 // RUN: %clang_analyze_cc1 -analyzer-checker=osx.cocoa.Dealloc -fblocks -triple x86_64-apple-macosx10.6.0 -DMACOS=1 -verify %s
3 // RUN: %clang_analyze_cc1 -analyzer-checker=osx.cocoa.Dealloc -fblocks -triple x86_64-apple-darwin10 -fobjc-arc -fobjc-runtime-has-weak -verify %s
5 #include "Inputs/system-header-simulator-for-objc-dealloc.h"
7 #define NON_ARC !__has_feature(objc_arc)
9 #if NON_ARC
10 #define WEAK_ON_ARC
11 #else
12 #define WEAK_ON_ARC __weak
13 #endif
15 // No diagnostics expected under ARC.
16 #if !NON_ARC
17   // expected-no-diagnostics
18 #endif
20 // Do not warn about missing release in -dealloc for ivars.
22 @interface MyIvarClass1 : NSObject {
23   NSObject *_ivar;
25 @end
27 @implementation MyIvarClass1
28 - (instancetype)initWithIvar:(NSObject *)ivar
30   self = [super init];
31   if (!self)
32     return nil;
33 #if NON_ARC
34   _ivar = [ivar retain];
35 #endif
36   return self;
38 - (void)dealloc
40 #if NON_ARC
41   [super dealloc];
42 #endif
44 @end
46 @interface MyIvarClass2 : NSObject {
47   NSObject *_ivar;
49 - (NSObject *)ivar;
50 - (void)setIvar:(NSObject *)ivar;
51 @end
53 @implementation MyIvarClass2
54 - (instancetype)init
56   self = [super init];
57   return self;
59 - (void)dealloc
61 #if NON_ARC
62   [super dealloc];
63 #endif
65 - (NSObject *)ivar
67   return _ivar;
69 - (void)setIvar:(NSObject *)ivar
71 #if NON_ARC
72   [_ivar release];
73   _ivar = [ivar retain];
74 #else
75  _ivar = ivar;
76 #endif
78 @end
80 // Warn about missing release in -dealloc for properties.
82 @interface MyPropertyClass1 : NSObject
83 @property (copy) NSObject *ivar;
84 @end
86 @implementation MyPropertyClass1
87 - (void)dealloc
89 #if NON_ARC
90   [super dealloc]; // expected-warning {{The '_ivar' ivar in 'MyPropertyClass1' was copied by a synthesized property but not released before '[super dealloc]'}}
91 #endif
93 @end
95 @interface MyPropertyClass2 : NSObject
96 @property (retain) NSObject *ivar;
97 @end
99 @implementation MyPropertyClass2
100 - (void)dealloc
102 #if NON_ARC
103   [super dealloc]; // expected-warning {{The '_ivar' ivar in 'MyPropertyClass2' was retained by a synthesized property but not released before '[super dealloc]'}}
104 #endif
106 @end
108 @interface MyPropertyClass3 : NSObject {
109   NSObject *_ivar;
111 @property (retain) NSObject *ivar;
112 @end
114 @implementation MyPropertyClass3
115 @synthesize ivar = _ivar;
116 - (void)dealloc
118 #if NON_ARC
119   [super dealloc]; // expected-warning {{The '_ivar' ivar in 'MyPropertyClass3' was retained by a synthesized property but not released before '[super dealloc]'}}
120 #endif
123 @end
125 @interface MyPropertyClass4 : NSObject {
126   void (^_blockPropertyIvar)(void);
128 @property (copy) void (^blockProperty)(void);
129 @property (copy) void (^blockProperty2)(void);
130 @property (copy) void (^blockProperty3)(void);
132 @end
134 @implementation MyPropertyClass4
135 @synthesize blockProperty = _blockPropertyIvar;
136 - (void)dealloc
138 #if NON_ARC
139   [_blockProperty2 release];
140   Block_release(_blockProperty3);
142   [super dealloc]; // expected-warning {{The '_blockPropertyIvar' ivar in 'MyPropertyClass4' was copied by a synthesized property but not released before '[super dealloc]'}}
143 #endif
145 @end
147 @interface MyPropertyClass5 : NSObject {
148   WEAK_ON_ARC NSObject *_ivar;
150 @property (weak) NSObject *ivar;
151 @end
153 @implementation MyPropertyClass5
154 @synthesize ivar = _ivar;
155 - (void)dealloc
157 #if NON_ARC
158   [super dealloc]; // no-warning because it is a weak property
159 #endif
161 @end
163 @interface MyPropertyClassWithReturnInDealloc : NSObject {
164   NSObject *_ivar;
166 @property (retain) NSObject *ivar;
167 @end
169 @implementation MyPropertyClassWithReturnInDealloc
170 @synthesize ivar = _ivar;
171 - (void)dealloc
173   return;
174 #if NON_ARC
175   // expected-warning@-2{{The '_ivar' ivar in 'MyPropertyClassWithReturnInDealloc' was retained by a synthesized property but not released before '[super dealloc]'}}
176   [super dealloc];
177 #endif
179 @end
181 @interface MyPropertyClassWithReleaseInOtherInstance : NSObject {
182   NSObject *_ivar;
183   MyPropertyClassWithReleaseInOtherInstance *_other;
185 @property (retain) NSObject *ivar;
187 -(void)releaseIvars;
188 @end
190 @implementation MyPropertyClassWithReleaseInOtherInstance
191 @synthesize ivar = _ivar;
193 -(void)releaseIvars; {
194 #if NON_ARC
195   [_ivar release];
196 #endif
199 - (void)dealloc
201   [_other releaseIvars];
202 #if NON_ARC
203   [super dealloc]; // expected-warning {{The '_ivar' ivar in 'MyPropertyClassWithReleaseInOtherInstance' was retained by a synthesized property but not released before '[super dealloc]'}}
204 #endif
206 @end
208 @interface MyPropertyClassWithNeitherReturnNorSuperDealloc : NSObject {
209   NSObject *_ivar;
211 @property (retain) NSObject *ivar;
212 @end
214 @implementation MyPropertyClassWithNeitherReturnNorSuperDealloc
215 @synthesize ivar = _ivar;
216 - (void)dealloc
219 #if NON_ARC
220   // expected-warning@-2 {{method possibly missing a [super dealloc] call}} (From Sema)
221   // expected-warning@-3{{The '_ivar' ivar in 'MyPropertyClassWithNeitherReturnNorSuperDealloc' was retained by a synthesized property but not released before '[super dealloc]'}}
222 #endif
223 @end
225 // <rdar://problem/6380411>: 'myproperty' has kind 'assign' and thus the
226 //  assignment through the setter does not perform a release.
228 @interface MyObject : NSObject {
229   id __unsafe_unretained _myproperty;
231 @property(assign) id myproperty;
232 @end
234 @implementation MyObject
235 @synthesize myproperty=_myproperty; // no-warning
236 - (void)dealloc {
237   // Don't claim that myproperty is released since it the property
238   // has the 'assign' attribute.
239   self.myproperty = 0; // no-warning
240 #if NON_ARC
241   [super dealloc];
242 #endif
244 @end
246 @interface ClassWithControlFlowInRelease : NSObject {
247   BOOL _ivar1;
249 @property (retain) NSObject *ivar2;
250 @end
252 @implementation ClassWithControlFlowInRelease
253 - (void)dealloc; {
254   if (_ivar1) {
255     // We really should warn because there is a path through -dealloc on which
256     // _ivar2 is not released.
257 #if NON_ARC
258     [_ivar2 release];
259 #endif
260   }
262 #if NON_ARC
263   [super dealloc]; // expected-warning {{The '_ivar2' ivar in 'ClassWithControlFlowInRelease' was retained by a synthesized property but not released before '[super dealloc]'}}
264 #endif
266 @end
268 // Don't warn when the property is nil'd out in -dealloc
270 @interface ClassWithNildOutProperty : NSObject
271 @property (retain) NSObject *ivar;
272 @property (assign) int *intPtrProp;
273 @end
275 @implementation ClassWithNildOutProperty
276 - (void)dealloc; {
277   self.ivar = nil;
279   // Make sure to handle setting a non-retainable property to 0.
280   self.intPtrProp = 0;
281 #if NON_ARC
282   [super dealloc];  // no-warning
283 #endif
285 @end
287 // Do warn when the ivar but not the property is nil'd out in -dealloc
289 @interface ClassWithNildOutIvar : NSObject
290 @property (retain) NSObject *ivar;
291 @end
293 @implementation ClassWithNildOutIvar
294 - (void)dealloc; {
295   // Oops. Meant self.ivar = nil
296   _ivar = nil;
298 #if NON_ARC
299   [super dealloc]; // expected-warning {{The '_ivar' ivar in 'ClassWithNildOutIvar' was retained by a synthesized property but not released before '[super dealloc]'}}
300 #endif
302 @end
304 // Do warn when the ivar is updated to a different value that is then
305 // released.
307 @interface ClassWithUpdatedIvar : NSObject
308 @property (retain) NSObject *ivar;
309 @end
311 @implementation ClassWithUpdatedIvar
312 - (void)dealloc; {
313   _ivar = [[NSObject alloc] init];
315 #if NON_ARC
316   [_ivar release];
317 #endif
319 #if NON_ARC
320   [super dealloc]; // expected-warning {{The '_ivar' ivar in 'ClassWithUpdatedIvar' was retained by a synthesized property but not released before '[super dealloc]'}}
321 #endif
323 @end
326 // Don't warn when the property is nil'd out with a setter in -dealloc
328 @interface ClassWithNildOutPropertyViaSetter : NSObject
329 @property (retain) NSObject *ivar;
330 @end
332 @implementation ClassWithNildOutPropertyViaSetter
333 - (void)dealloc; {
334   [self setIvar:nil];
336 #if NON_ARC
337   [super dealloc];  // no-warning
338 #endif
340 @end
343 // Don't warn about missing releases when -dealloc helpers are called.
345 @interface ClassWithDeallocHelpers : NSObject
346 @property (retain) NSObject *ivarReleasedInMethod;
347 @property (retain) NSObject *propNilledOutInMethod;
349 @property (retain) NSObject *ivarReleasedInFunction;
350 @property (retain) NSObject *propNilledOutInFunction;
352 @property (retain) NSObject *ivarNeverReleased;
353 - (void)invalidateInMethod;
354 @end
356 void ReleaseValueHelper(NSObject *iv) {
357 #if NON_ARC
358   [iv release];
359 #endif
362 void NilOutPropertyHelper(ClassWithDeallocHelpers *o) {
363   o.propNilledOutInFunction = nil;
366 @implementation ClassWithDeallocHelpers
367 - (void)invalidateInMethod {
368 #if NON_ARC
369   [_ivarReleasedInMethod release];
370 #endif
371   self.propNilledOutInMethod = nil;
374 - (void)dealloc; {
375   ReleaseValueHelper(_ivarReleasedInFunction);
376   NilOutPropertyHelper(self);
378   [self invalidateInMethod];
379 #if NON_ARC
380   [super dealloc]; // expected-warning {{The '_ivarNeverReleased' ivar in 'ClassWithDeallocHelpers' was retained by a synthesized property but not released before '[super dealloc]'}}
381 #endif
383 @end
386 // Don't warn when self in -dealloc escapes.
388 @interface ClassWhereSelfEscapesViaMethodCall : NSObject
389 @property (retain) NSObject *ivar;  // no-warning
390 @end
392 @interface ClassWhereSelfEscapesViaMethodCall (Other)
393 - (void)invalidate; // In other translation unit.
394 @end
396 @implementation ClassWhereSelfEscapesViaMethodCall
397 - (void)dealloc; {
398   [self invalidate];
399 #if NON_ARC
400   [super dealloc];
401 #endif
402 } // no-warning
403 @end
405 @interface ClassWhereSelfEscapesViaPropertyAccess : NSObject
406 @property (retain) NSObject *ivar;
407 @end
409 @interface ClassWhereSelfEscapesViaPropertyAccess (Other)
410 // The implementation of this property is unknown and therefore could
411 // release ivar.
412 @property (retain) NSObject *otherIvar;
413 @end
415 @implementation ClassWhereSelfEscapesViaPropertyAccess
416 - (void)dealloc; {
417   self.otherIvar = nil;
418 #if NON_ARC
419   [super dealloc];
420 #endif
421 } // no-warning
422 @end
424 // Don't treat self as escaping when setter called on *synthesized*
425 // property.
427 @interface ClassWhereSelfEscapesViaSynthesizedPropertyAccess : NSObject
428 @property (retain) NSObject *ivar;
429 @property (retain) NSObject *otherIvar;
430 @end
432 @implementation ClassWhereSelfEscapesViaSynthesizedPropertyAccess
433 - (void)dealloc; {
434   self.otherIvar = nil;
435 #if NON_ARC
436   [super dealloc];  // expected-warning {{The '_ivar' ivar in 'ClassWhereSelfEscapesViaSynthesizedPropertyAccess' was retained by a synthesized property but not released before '[super dealloc]'}}
437 #endif
439 @end
442 // Don't treat calls to system headers as escapes
444 @interface ClassWhereSelfEscapesViaCallToSystem : NSObject
445 @property (retain) NSObject *ivar1;
446 @property (retain) NSObject *ivar2;
447 @property (retain) NSObject *ivar3;
448 @property (retain) NSObject *ivar4;
449 @property (retain) NSObject *ivar5;
450 @property (retain) NSObject *ivar6;
451 @end
453 @implementation ClassWhereSelfEscapesViaCallToSystem
454 - (void)dealloc; {
455 #if NON_ARC
456   [_ivar2 release];
457   if (_ivar3) {
458     [_ivar3 release];
459   }
460 #endif
462   [[NSRunLoop currentRunLoop] cancelPerformSelectorsWithTarget:self];
463   [[NSNotificationCenter defaultCenter] removeObserver:self];
465 #if NON_ARC
466   [_ivar4 release];
468   if (_ivar5) {
469     [_ivar5 release];
470   }
471 #endif
473   [[NSNotificationCenter defaultCenter] removeObserver:self];
475 #if NON_ARC
476   if (_ivar6) {
477     [_ivar6 release];
478   }
480   [super dealloc];  // expected-warning {{The '_ivar1' ivar in 'ClassWhereSelfEscapesViaCallToSystem' was retained by a synthesized property but not released before '[super dealloc]'}}
481 #endif
483 @end
485 // Don't warn when value escapes.
487 @interface ClassWhereIvarValueEscapes : NSObject
488 @property (retain) NSObject *ivar;
489 @end
491 void ReleaseMe(id arg);
493 @implementation ClassWhereIvarValueEscapes
494 - (void)dealloc; {
496   ReleaseMe(_ivar);
498 #if NON_ARC
499   [super dealloc];
500 #endif
501 } // no-warning
502 @end
504 // Don't warn when value is known to be nil.
506 @interface ClassWhereIvarIsNil : NSObject
507 @property (retain) NSObject *ivarIsNil;
508 @end
510 @implementation ClassWhereIvarIsNil
511 - (void)dealloc; {
513 #if NON_ARC
514   if (_ivarIsNil)
515     [_ivarIsNil release];
517   [super dealloc];
518 #endif
519 } // no-warning
520 @end
523 // Don't warn for non-retainable properties.
525 @interface ClassWithNonRetainableProperty : NSObject
526 @property (assign) int *ivar;  // no-warning
527 @end
529 @implementation ClassWithNonRetainableProperty
530 - (void)dealloc; {
531 #if NON_ARC
532   [super dealloc];
533 #endif
534 } // no-warning
535 @end
538 @interface SuperClassOfClassWithInlinedSuperDealloc : NSObject
539 @property (retain) NSObject *propInSuper;
540 @end
542 @implementation SuperClassOfClassWithInlinedSuperDealloc
543 - (void)dealloc {
544 #if NON_ARC
545   [super dealloc]; // expected-warning {{The '_propInSuper' ivar in 'SuperClassOfClassWithInlinedSuperDealloc' was retained by a synthesized property but not released before '[super dealloc]'}}
546 #endif
548 @end
550 @interface ClassWithInlinedSuperDealloc : SuperClassOfClassWithInlinedSuperDealloc
551 @property (retain) NSObject *propInSub;
552 @end
554 @implementation ClassWithInlinedSuperDealloc
555 - (void)dealloc {
556 #if NON_ARC
557   [super dealloc]; // expected-warning {{The '_propInSub' ivar in 'ClassWithInlinedSuperDealloc' was retained by a synthesized property but not released before '[super dealloc]'}}
558 #endif
560 @end
563 @interface SuperClassOfClassWithInlinedSuperDeallocAndInvalidation : NSObject
564 @property (retain) NSObject *propInSuper;
566 - (void)invalidate;
567 @end
569 @implementation SuperClassOfClassWithInlinedSuperDeallocAndInvalidation
571 - (void)invalidate {
572 #if NON_ARC
573   [_propInSuper release];
574 #endif
575   _propInSuper = nil;
578 - (void)dealloc {
579   [self invalidate];
580 #if NON_ARC
581   [super dealloc]; // no-warning
582 #endif
584 @end
586 @interface ClassWithInlinedSuperDeallocAndInvalidation : SuperClassOfClassWithInlinedSuperDeallocAndInvalidation
587 @property (retain) NSObject *propInSub;
588 @end
590 @implementation ClassWithInlinedSuperDeallocAndInvalidation
592 - (void)invalidate {
593 #if NON_ARC
594   [_propInSub release];
595 #endif
596   [super invalidate];
599 - (void)dealloc {
600 #if NON_ARC
601   [super dealloc]; // no-warning
602 #endif
604 @end
607 @interface SuperClassOfClassThatEscapesBeforeInliningSuper : NSObject
608 @property (retain) NSObject *propInSuper;
609 @end
611 @implementation SuperClassOfClassThatEscapesBeforeInliningSuper
613 - (void)dealloc {
615 #if NON_ARC
616   [super dealloc]; // expected-warning {{The '_propInSuper' ivar in 'SuperClassOfClassThatEscapesBeforeInliningSuper' was retained by a synthesized property but not released before '[super dealloc]'}}
617 #endif
619 @end
621 @interface ClassThatEscapesBeforeInliningSuper : SuperClassOfClassThatEscapesBeforeInliningSuper
622 @property (retain) NSObject *propInSub;
623 @end
625 @interface ClassThatEscapesBeforeInliningSuper (Other)
626 - (void)invalidate; // No implementation in translation unit.
627 @end
629 @implementation ClassThatEscapesBeforeInliningSuper
630 - (void)dealloc {
631   [self invalidate];
633 #if NON_ARC
634   [super dealloc]; // no-warning
635 #endif
637 @end
640 #if NON_ARC
641 @interface ReleaseIvarInField : NSObject {
642   int _tag;
643   union {
644     NSObject *field1;
645     NSObject *field2;
646   } _someUnion;
648   struct {
649     NSObject *field1;
650   } _someStruct;
652 @end
654 @implementation ReleaseIvarInField
655 - (void)dealloc {
656   if (_tag) {
657     [_someUnion.field1 release];
658   } else {
659     [_someUnion.field2 release];
660   }
662   [_someStruct.field1 release];
663   [super dealloc];
665 @end
666 #endif
668 struct SomeStruct {
669   int f;
671 @interface ZeroOutStructWithSetter : NSObject
672   @property(assign) struct SomeStruct s;
673 @end
675 @implementation ZeroOutStructWithSetter
676 - (void)dealloc {
677   struct SomeStruct zeroedS;
678   zeroedS.f = 0;
680   self.s = zeroedS;
681 #if NON_ARC
682   [super dealloc];
683 #endif
685 @end
687 #if NON_ARC
688 @interface ReleaseIvarInArray : NSObject {
689   NSObject *_array[3];
691 @end
693 @implementation ReleaseIvarInArray
694 - (void)dealloc {
695   for (int i = 0; i < 3; i++) {
696     [_array[i] release];
697   }
698   [super dealloc];
700 @end
701 #endif
703 // Don't warn about missing releases for subclasses of SenTestCase or
704 // for classes that are not subclasses of NSObject.
706 @interface SenTestCase : NSObject {}
707 @end
709 @interface MyClassTest : SenTestCase
710 @property (retain) NSObject *ivar;
711 @end
713 @implementation MyClassTest
714 -(void)tearDown {
715 #if NON_ARC
716   [_ivar release];
717 #endif
720 -(void)dealloc; {
721 #if NON_ARC
722   [super dealloc]; // no-warning
723 #endif
725 @end
727 @interface XCTestCase : NSObject {}
728 @end
730 @interface MyClassXCTest : XCTestCase
731 @property (retain) NSObject *ivar;
732 @end
734 @implementation MyClassXCTest
735 -(void)tearDown {
736 #if NON_ARC
737   [_ivar release];
738 #endif
741 -(void)dealloc; {
742 #if NON_ARC
743   [super dealloc]; // no-warning
744 #endif
746 @end
749 __attribute__((objc_root_class))
750 @interface NonNSObjectMissingDealloc
751 @property (retain) NSObject *ivar;
752 @end
753 @implementation NonNSObjectMissingDealloc
754 -(void)dealloc; {
757 @end
759 // Warn about calling -dealloc rather than release by mistake.
761 @interface CallDeallocOnRetainPropIvar : NSObject {
762   NSObject *okToDeallocDirectly;
765 @property (retain) NSObject *ivar;
766 @end
768 @implementation CallDeallocOnRetainPropIvar
769 - (void)dealloc
771 #if NON_ARC
772   // Only warn for synthesized ivars.
773   [okToDeallocDirectly dealloc]; // no-warning
774   [_ivar dealloc];  // expected-warning {{'_ivar' should be released rather than deallocated}}
776   [super dealloc];
777 #endif
779 @end
781 // CIFilter special cases.
782 // By design, -[CIFilter dealloc] releases (by calling -setValue: forKey: with
783 // 'nil') all ivars (even in its *subclasses*) with names starting with
784 // 'input' or that are backed by properties with names starting with 'input'.
785 // The Dealloc checker needs to take particular care to not warn about missing
786 // releases in this case -- if the user adds a release quiet the
787 // warning it may result in an over release.
789 @interface ImmediateSubCIFilter : CIFilter {
790   NSObject *inputIvar;
791   NSObject *nonInputIvar;
792   NSObject *notPrefixedButBackingPrefixedProperty;
793   NSObject *inputPrefixedButBackingNonPrefixedProperty;
796 @property(retain) NSObject *inputIvar;
797 @property(retain) NSObject *nonInputIvar;
798 @property(retain) NSObject *inputAutoSynthesizedIvar;
799 @property(retain) NSObject *inputExplicitlySynthesizedToNonPrefixedIvar;
800 @property(retain) NSObject *nonPrefixedPropertyBackedByExplicitlySynthesizedPrefixedIvar;
802 @end
804 @implementation ImmediateSubCIFilter
805 @synthesize inputIvar = inputIvar;
806 @synthesize nonInputIvar = nonInputIvar;
807 @synthesize inputExplicitlySynthesizedToNonPrefixedIvar = notPrefixedButBackingPrefixedProperty;
808 @synthesize nonPrefixedPropertyBackedByExplicitlySynthesizedPrefixedIvar = inputPrefixedButBackingNonPrefixedProperty;
810 - (void)dealloc {
811 #if NON_ARC
812   // We don't want warnings here for:
813   // inputIvar
814   // inputAutoSynthesizedIvar
815   // inputExplicitlySynthesizedToNonPrefixedIvar
816   // inputPrefixedButBackingNonPrefixedProperty
817   [super dealloc];
818   // expected-warning@-1 {{The 'nonInputIvar' ivar in 'ImmediateSubCIFilter' was retained by a synthesized property but not released before '[super dealloc]'}}
819 #endif
821 @end
823 @interface SubSubCIFilter : CIFilter {
824   NSObject *inputIvarInSub;
827 @property(retain) NSObject *inputIvarInSub;
828 @end
830 @implementation SubSubCIFilter
831 @synthesize inputIvarInSub = inputIvarInSub;
833 - (void)dealloc {
834 // Don't warn about inputIvarInSub.
835 #if NON_ARC
836   [super dealloc];
837 #endif
839 @end
840 @interface OverreleasingCIFilter : CIFilter {
841   NSObject *inputIvar;
844 @property(retain) NSObject *inputIvar;
845 @end
847 @implementation OverreleasingCIFilter
848 @synthesize inputIvar = inputIvar;
850 - (void)dealloc {
851 #if NON_ARC
852   // This is an over release because CIFilter's dealloc will also release it.
853   [inputIvar release]; // expected-warning {{The 'inputIvar' ivar in 'OverreleasingCIFilter' will be released by '-[CIFilter dealloc]' but also released here}}
854   [super dealloc]; // no-warning
855   #endif
857 @end
860 @interface NotMissingDeallocCIFilter : CIFilter {
861   NSObject *inputIvar;
864 @property(retain) NSObject *inputIvar;
865 @end
867 @implementation NotMissingDeallocCIFilter // no-warning
868 @synthesize inputIvar = inputIvar;
869 @end
872 @interface ClassWithRetainPropWithIBOutletIvarButNoSetter : NSObject {
873   // On macOS, the nib-loading code will set the ivar directly without
874   // retaining value (unike iOS, where it is retained). This means that
875   // on macOS we should not warn about a missing release for a property backed
876   // by an IBOutlet ivar when that property does not have a setter.
877   IBOutlet NSObject *ivarForOutlet;
880 @property (readonly, retain) NSObject *ivarForOutlet;
881 @end
883 @implementation ClassWithRetainPropWithIBOutletIvarButNoSetter
885 @synthesize ivarForOutlet;
886 - (void)dealloc {
888 #if NON_ARC
889   [super dealloc];
890 #if !MACOS
891 // expected-warning@-2{{The 'ivarForOutlet' ivar in 'ClassWithRetainPropWithIBOutletIvarButNoSetter' was retained by a synthesized property but not released before '[super dealloc]'}}
892 #endif
893 #endif
896 @end
898 @interface ClassWithRetainPropWithIBOutletIvarAndShadowingReadWrite : NSObject {
899   IBOutlet NSObject *ivarForOutlet;
902 @property (readonly, retain) NSObject *ivarForOutlet;
904 @end
906 @interface ClassWithRetainPropWithIBOutletIvarAndShadowingReadWrite ()
908 // Since there is a shadowing readwrite property, there will be a retaining
909 // setter and so the ivar will be retained by nib-loading code even on
910 // macOS and therefore must be released.
911 @property (readwrite, retain) NSObject *ivarForOutlet;
912 @end
914 @implementation ClassWithRetainPropWithIBOutletIvarAndShadowingReadWrite
916 @synthesize ivarForOutlet;
917 - (void)dealloc {
919 #if NON_ARC
920   [super dealloc];
921 // expected-warning@-1{{The 'ivarForOutlet' ivar in 'ClassWithRetainPropWithIBOutletIvarAndShadowingReadWrite' was retained by a synthesized property but not released before '[super dealloc]'}}
922 #endif
925 @end