if (PropRef && PropRef->isMessagingGetter()) {
const Expr *GetterMessageSend =
POE->getSemanticExpr(POE->getNumSemanticExprs() - 1);
- assert(isa<ObjCMessageExpr>(GetterMessageSend));
+ assert(isa<ObjCMessageExpr>(GetterMessageSend->IgnoreParenCasts()));
return peelOffOuterExpr(GetterMessageSend, N);
}
}
// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-config suppress-null-return-paths=false -verify %s
// RUN: %clang_cc1 -analyze -analyzer-checker=core -verify -DSUPPRESSED=1 %s
+// RUN: %clang_cc1 -analyze -analyzer-checker=core -fobjc-arc -verify -DSUPPRESSED=1 %s
// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-config avoid-suppressing-null-argument-paths=true -DSUPPRESSED=1 -DNULL_ARGS=1 -verify %s
-#ifdef SUPPRESSED
+#define ARC __has_feature(objc_arc)
+
+#if defined(SUPPRESSED) && !ARC
// expected-no-diagnostics
#endif
void testNilReceiverHelperB(int *x) {
*x = 1;
-#ifndef SUPPRESSED
- // expected-warning@-2 {{Dereference of null pointer}}
+// FIXME: Suppression for this case isn't working under ARC. It should.
+#if !defined(SUPPRESSED) || (defined(SUPPRESSED) && ARC)
+ // expected-warning@-3 {{Dereference of null pointer}}
#endif
}
// FALSE NEGATIVES (over-suppression)
__attribute__((objc_root_class))
-@interface SomeClass
+@interface SomeClass {
+ int ivar;
+}
-(int *)methodReturningNull;
@property(readonly) int *propertyReturningNull;
@property(readonly) int *synthesizedProperty;
+@property(readonly) SomeClass *propertyReturningNil;
+
@end
@interface SubOfSomeClass : SomeClass
return 0;
}
+-(SomeClass *)propertyReturningNil {
+ return 0;
+}
+
+(int *)classPropertyReturningNull {
return 0;
}
#endif
}
+@implementation SomeClass (ForTestOfPropertyReturningNil)
+void testPropertyReturningNil(SomeClass *sc) {
+ SomeClass *result = sc.propertyReturningNil;
+ result->ivar = 1;
+#ifndef SUPPRESSED
+ // expected-warning@-2 {{Access to instance variable 'ivar' results in a dereference of a null pointer (loaded from variable 'result')}}
+#endif
+}
+@end
+
void testSynthesizedPropertyReturningNull(SomeClass *sc) {
if (sc.synthesizedProperty)
return;