// RUN: %clangxx_tsan %s -o %t -framework Foundation -std=c++11 // RUN: %run %t 2>&1 | FileCheck %s #import <Foundation/Foundation.h> #import <libkern/OSAtomic.h> #include <thread> volatile int64_t retainCount = 0; long g = 0; void dealloc() { g = 42; } void release() { if (OSAtomicAdd64Barrier(-1, &retainCount) == 0) { dealloc(); } } void retain() { OSAtomicAdd64Barrier(1, &retainCount); } int main(int argc, const char * argv[]) { fprintf(stderr, "start\n"); retain(); retain(); std::thread t([]{ release(); }); g = 47; release(); t.join(); fprintf(stderr, "end, g = %ld\n", g); return 0; } // CHECK: start // CHECK: end, g = 42 // CHECK-NOT: WARNING: ThreadSanitizer