diff options
-rw-r--r-- | lib/Analysis/SVals.cpp | 4 | ||||
-rw-r--r-- | test/Analysis/NSString-failed-cases.m | 9 | ||||
-rw-r--r-- | test/Analysis/NSString.m | 8 |
3 files changed, 12 insertions, 9 deletions
diff --git a/lib/Analysis/SVals.cpp b/lib/Analysis/SVals.cpp index 9163b27252..fbdb73b0ef 100644 --- a/lib/Analysis/SVals.cpp +++ b/lib/Analysis/SVals.cpp @@ -97,6 +97,10 @@ const MemRegion *SVal::getAsRegion() const { if (const loc::MemRegionVal *X = dyn_cast<loc::MemRegionVal>(this)) return X->getRegion(); + if (const nonloc::LocAsInteger *X = dyn_cast<nonloc::LocAsInteger>(this)) { + return X->getLoc().getAsRegion(); + } + return 0; } diff --git a/test/Analysis/NSString-failed-cases.m b/test/Analysis/NSString-failed-cases.m index 2b8242f0d0..699d142eec 100644 --- a/test/Analysis/NSString-failed-cases.m +++ b/test/Analysis/NSString-failed-cases.m @@ -97,15 +97,6 @@ extern void *_NSConstantStringClassReference; //===----------------------------------------------------------------------===// // FIXME: THIS TEST CASE INCORRECTLY REPORTS A LEAK. -void testOSCompareAndSwapXXBarrier_parameter(NSString **old) { - NSString *s = [[NSString alloc] init]; // no-warning - if (!COMPARE_SWAP_BARRIER((intptr_t) 0, (intptr_t) s, (intptr_t*) old)) - [s release]; - else - [*old release]; -} - -// FIXME: THIS TEST CASE INCORRECTLY REPORTS A LEAK. void testOSCompareAndSwapXXBarrier_parameter_no_direct_release(NSString **old) { NSString *s = [[NSString alloc] init]; // no-warning if (!COMPARE_SWAP_BARRIER((intptr_t) 0, (intptr_t) s, (intptr_t*) old)) diff --git a/test/Analysis/NSString.m b/test/Analysis/NSString.m index fb44309b12..b5d510a5ed 100644 --- a/test/Analysis/NSString.m +++ b/test/Analysis/NSString.m @@ -388,3 +388,11 @@ void test_synchronized(id x) { } } @end + +void testOSCompareAndSwapXXBarrier_parameter(NSString **old) { + NSString *s = [[NSString alloc] init]; // no-warning + if (!COMPARE_SWAP_BARRIER((intptr_t) 0, (intptr_t) s, (intptr_t*) old)) + [s release]; + else + [*old release]; +} |