Revert "[lldb][test] Remove compiler version check and use regex" (#124101)
[llvm-project.git] / compiler-rt / test / tsan / Darwin / objc-synchronize-cycle-tagged.mm
blob23589365ee437c17b53a7382eb421a01e29b6e2f
1 // RUN: %clangxx_tsan %s -o %t -framework Foundation -fobjc-arc
2 // RUN:     %run %t 6 2>&1 | FileCheck %s --check-prefix=SIX
3 // RUN: not %run %t 7 2>&1 | FileCheck %s --check-prefix=SEVEN
5 #import <Foundation/Foundation.h>
7 static bool isTaggedPtr(id obj) {
8   uintptr_t ptr = (uintptr_t) obj;
9   return (ptr & 0x8000000000000001ull) != 0;
12 int main(int argc, char* argv[]) {
13   assert(argc == 2);
14   int arg = atoi(argv[1]);
16   @autoreleasepool {
17     NSObject* obj = [NSObject new];
18     NSObject* num1 = [NSNumber numberWithInt:7];
19     NSObject* num2 = [NSNumber numberWithInt:arg];
21     assert(!isTaggedPtr(obj));
22     assert(isTaggedPtr(num1) && isTaggedPtr(num2));
24     // obj -> num1 (includes num2)
25     @synchronized(obj) {
26       @synchronized(num1) {
27       }
28     }
30     // num2 -> obj1
31     @synchronized(num2) {
32       @synchronized(obj) {
33 // SEVEN: ThreadSanitizer: lock-order-inversion (potential deadlock)
34       }
35     }
36   }
38   NSLog(@"PASS");
39 // SIX-NOT: ThreadSanitizer
40 // SIX: PASS
41   return 0;