|  | // RUN: %clang_cc1 -fsyntax-only -verify  %s | 
|  |  | 
|  | #define NO_SANITIZE_THREAD __attribute__((no_sanitize_thread)) | 
|  |  | 
|  | #if !__has_attribute(no_sanitize_thread) | 
|  | #error "Should support no_sanitize_thread" | 
|  | #endif | 
|  |  | 
|  | void noanal_fun() NO_SANITIZE_THREAD; | 
|  |  | 
|  | void noanal_fun_alt() __attribute__((__no_sanitize_thread__)); | 
|  |  | 
|  | void noanal_fun_args() __attribute__((no_sanitize_thread(1))); // \ | 
|  | // expected-error {{'no_sanitize_thread' attribute takes no arguments}} | 
|  |  | 
|  | int noanal_testfn(int y) NO_SANITIZE_THREAD; | 
|  |  | 
|  | int noanal_testfn(int y) { | 
|  | int x NO_SANITIZE_THREAD = y; // \ | 
|  | // expected-error {{'no_sanitize_thread' attribute only applies to functions}} | 
|  | return x; | 
|  | } | 
|  |  | 
|  | int noanal_test_var NO_SANITIZE_THREAD; // \ | 
|  | // expected-error {{'no_sanitize_thread' attribute only applies to functions}} | 
|  |  | 
|  | class NoanalFoo { | 
|  | private: | 
|  | int test_field NO_SANITIZE_THREAD; // \ | 
|  | // expected-error {{'no_sanitize_thread' attribute only applies to functions}} | 
|  | void test_method() NO_SANITIZE_THREAD; | 
|  | }; | 
|  |  | 
|  | class NO_SANITIZE_THREAD NoanalTestClass { // \ | 
|  | // expected-error {{'no_sanitize_thread' attribute only applies to functions}} | 
|  | }; | 
|  |  | 
|  | void noanal_fun_params(int lvar NO_SANITIZE_THREAD); // \ | 
|  | // expected-error {{'no_sanitize_thread' attribute only applies to functions}} |