From: Zhongxing Xu Date: Mon, 11 Jan 2010 06:52:53 +0000 (+0000) Subject: Enhance SVals::getAsRegion: get the region that is converted to an integer. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=604848a49d2a9c0985225bbe3a39fca223e961bb;p=clang Enhance SVals::getAsRegion: get the region that is converted to an integer. This with previous patch fixes a OSAtomic test case. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@93146 91177308-0d34-0410-b5e6-96231b3b80d8 --- 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(this)) return X->getRegion(); + if (const nonloc::LocAsInteger *X = dyn_cast(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 @@ -96,15 +96,6 @@ extern void *_NSConstantStringClassReference; // stop reporting leaks. //===----------------------------------------------------------------------===// -// 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 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]; +}