|  | // RUN: %clang_cc1 -triple x86_64-apple-darwin -x objective-c++ -fblocks -emit-llvm -o - %s | FileCheck -check-prefix=WITHOUT %s | 
|  | // RUN: %clang_cc1 -triple x86_64-apple-darwin -x objective-c++ -fblocks -emit-llvm -o - %s -fsanitize=thread | FileCheck -check-prefix=TSAN %s | 
|  |  | 
|  | // WITHOUT-NOT: "sanitize_thread_no_checking_at_run_time" | 
|  |  | 
|  | __attribute__((objc_root_class)) | 
|  | @interface NSObject | 
|  | - (void)dealloc; | 
|  | @end | 
|  |  | 
|  | class NeedCleanup { | 
|  | public: | 
|  | ~NeedCleanup() __attribute__((no_sanitize("thread"))) {} | 
|  | }; | 
|  |  | 
|  | @interface MyObject : NSObject { | 
|  | NeedCleanup v; | 
|  | }; | 
|  | + (void) initialize; | 
|  | - (void) dealloc; | 
|  | @end | 
|  |  | 
|  | @implementation MyObject | 
|  | + (void)initialize { | 
|  | } | 
|  | - (void)dealloc { | 
|  | [super dealloc]; | 
|  | } | 
|  | @end | 
|  |  | 
|  | // TSAN: initialize{{.*}}) [[ATTR:#[0-9]+]] | 
|  | // TSAN: dealloc{{.*}}) [[ATTR:#[0-9]+]] | 
|  | // TSAN: cxx_destruct{{.*}}) [[ATTR:#[0-9]+]] | 
|  |  | 
|  | void test2(id x) { | 
|  | extern void test2_helper(id (^)(void)); | 
|  | test2_helper(^{ return x; }); | 
|  | // TSAN: define linkonce_odr hidden void @__destroy_helper_block_8_32o(i8*) unnamed_addr [[ATTR:#[0-9]+]] | 
|  | } | 
|  |  | 
|  | // TSAN: attributes [[ATTR]] = { noinline nounwind {{.*}} "sanitize_thread_no_checking_at_run_time" {{.*}} } |