diff options
-rw-r--r-- | lib/Analysis/GRExprEngine.cpp | 5 | ||||
-rw-r--r-- | test/Analysis/NSString.m | 12 |
2 files changed, 14 insertions, 3 deletions
diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp index 9f049d5b33..43d7331dd9 100644 --- a/lib/Analysis/GRExprEngine.cpp +++ b/lib/Analysis/GRExprEngine.cpp @@ -1377,9 +1377,10 @@ static bool EvalOSAtomic(ExplodedNodeSet<GRState>& Dst, const char *FName = FD->getNameAsCString(); // Check for compare and swap. - if (strncmp(FName, "OSAtomicCompareAndSwap", 22) == 0) + if (strncmp(FName, "OSAtomicCompareAndSwap", 22) == 0 || + strncmp(FName, "objc_atomicCompareAndSwap", 25) == 0) return EvalOSAtomicCompareAndSwap(Dst, Engine, Builder, CE, L, Pred); - + // FIXME: Other atomics. return false; } diff --git a/test/Analysis/NSString.m b/test/Analysis/NSString.m index b1e524f6c5..9de6853cdf 100644 --- a/test/Analysis/NSString.m +++ b/test/Analysis/NSString.m @@ -216,13 +216,23 @@ id testSharedClassFromFunction() { // Test OSCompareAndSwap _Bool OSAtomicCompareAndSwapPtr( void *__oldValue, void *__newValue, void * volatile *__theValue ); +extern BOOL objc_atomicCompareAndSwapPtr(id predicate, id replacement, volatile id *objectLocation); void testOSCompareAndSwap() { NSString *old = 0; - NSString *s = [[NSString alloc] init]; + NSString *s = [[NSString alloc] init]; // no-warning if (!OSAtomicCompareAndSwapPtr(0, s, (void**) &old)) [s release]; else [old release]; } +void test_objc_atomicCompareAndSwap() { + NSString *old = 0; + NSString *s = [[NSString alloc] init]; // no-warning + if (!objc_atomicCompareAndSwapPtr(0, s, &old)) + [s release]; + else + [old release]; +} + |