1*7c3d14c8STreehugger Robot// Check that we don't crash when dispatch_main calls pthread_exit which 2*7c3d14c8STreehugger Robot// quits the main thread. 3*7c3d14c8STreehugger Robot 4*7c3d14c8STreehugger Robot// RUN: %clang_tsan %s -o %t -framework Foundation 5*7c3d14c8STreehugger Robot// RUN: %env_tsan_opts=ignore_interceptors_accesses=1 %run %t 2>&1 | FileCheck %s 6*7c3d14c8STreehugger Robot 7*7c3d14c8STreehugger Robot#import <Foundation/Foundation.h> 8*7c3d14c8STreehugger Robot 9*7c3d14c8STreehugger Robotint main() { 10*7c3d14c8STreehugger Robot fprintf(stderr,"Hello world"); 11*7c3d14c8STreehugger Robot 12*7c3d14c8STreehugger Robot dispatch_queue_t q = dispatch_queue_create("my.queue", DISPATCH_QUEUE_SERIAL); 13*7c3d14c8STreehugger Robot 14*7c3d14c8STreehugger Robot dispatch_async(q, ^{ 15*7c3d14c8STreehugger Robot fprintf(stderr,"1"); 16*7c3d14c8STreehugger Robot }); 17*7c3d14c8STreehugger Robot 18*7c3d14c8STreehugger Robot dispatch_async(q, ^{ 19*7c3d14c8STreehugger Robot fprintf(stderr,"2"); 20*7c3d14c8STreehugger Robot }); 21*7c3d14c8STreehugger Robot 22*7c3d14c8STreehugger Robot dispatch_async(q, ^{ 23*7c3d14c8STreehugger Robot fprintf(stderr,"3"); 24*7c3d14c8STreehugger Robot 25*7c3d14c8STreehugger Robot dispatch_async(dispatch_get_main_queue(), ^{ 26*7c3d14c8STreehugger Robot fprintf(stderr,"Done."); 27*7c3d14c8STreehugger Robot sleep(1); 28*7c3d14c8STreehugger Robot exit(0); 29*7c3d14c8STreehugger Robot }); 30*7c3d14c8STreehugger Robot }); 31*7c3d14c8STreehugger Robot 32*7c3d14c8STreehugger Robot dispatch_main(); 33*7c3d14c8STreehugger Robot} 34*7c3d14c8STreehugger Robot 35*7c3d14c8STreehugger Robot// CHECK: Hello world 36*7c3d14c8STreehugger Robot// CHECK: Done. 37*7c3d14c8STreehugger Robot// CHECK-NOT: WARNING: ThreadSanitizer 38*7c3d14c8STreehugger Robot// CHECK-NOT: CHECK failed 39