diff options
-rw-r--r-- | clang/lib/Checker/CheckDeadStores.cpp | 3 | ||||
-rw-r--r-- | clang/test/Analysis/dead-stores.m | 7 |
2 files changed, 9 insertions, 1 deletions
diff --git a/clang/lib/Checker/CheckDeadStores.cpp b/clang/lib/Checker/CheckDeadStores.cpp index 4a7ca705488..31f9390e622 100644 --- a/clang/lib/Checker/CheckDeadStores.cpp +++ b/clang/lib/Checker/CheckDeadStores.cpp @@ -142,7 +142,8 @@ public: if (VarDecl *VD = dyn_cast<VarDecl>(DR->getDecl())) { // Special case: check for assigning null to a pointer. // This is a common form of defensive programming. - if (VD->getType()->isPointerType()) { + QualType T = VD->getType(); + if (T->isPointerType() || T->isObjCObjectPointerType()) { if (B->getRHS()->isNullPointerConstant(Ctx, Expr::NPC_ValueDependentIsNull)) return; diff --git a/clang/test/Analysis/dead-stores.m b/clang/test/Analysis/dead-stores.m index 765a24a3c35..701e5802b25 100644 --- a/clang/test/Analysis/dead-stores.m +++ b/clang/test/Analysis/dead-stores.m @@ -34,3 +34,10 @@ void DeadStoreTest(NSObject *anObject) { ([keys containsObject:@"name"] && [keys containsObject:@"icon"])) {} } +// This test case was a false positive due to how clang models +// pointer types and ObjC object pointer types differently. Here +// we don't warn about a dead store because 'nil' is assigned to +// an object pointer for the sake of defensive programming. +void rdar_7631278(NSObject *x) { + x = ((void*)0); +} |