| // RUN: %check_clang_tidy %s darwin-dispatch-once-nonstatic %t |
| |
| typedef int dispatch_once_t; |
| extern void dispatch_once(dispatch_once_t *pred, void(^block)(void)); |
| |
| |
| void bad_dispatch_once(dispatch_once_t once, void(^block)(void)) {} |
| // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: dispatch_once_t variables must have static or global storage duration; function parameters should be pointer references [darwin-dispatch-once-nonstatic] |
| |
| // file-scope dispatch_once_ts have static storage duration. |
| dispatch_once_t global_once; |
| static dispatch_once_t file_static_once; |
| namespace { |
| dispatch_once_t anonymous_once; |
| } // end anonymous namespace |
| |
| int Correct(void) { |
| static int value; |
| static dispatch_once_t once; |
| dispatch_once(&once, ^{ |
| value = 1; |
| }); |
| return value; |
| } |
| |
| int Incorrect(void) { |
| static int value; |
| dispatch_once_t once; |
| // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: dispatch_once_t variables must have static or global storage duration [darwin-dispatch-once-nonstatic] |
| // CHECK-FIXES: static dispatch_once_t once; |
| dispatch_once(&once, ^{ |
| value = 1; |
| }); |
| return value; |
| } |
| |
| struct OnceStruct { |
| static dispatch_once_t staticOnce; // Allowed |
| int value; |
| dispatch_once_t once; // Allowed (at this time) |
| }; |
| |
| @interface MyObject { |
| dispatch_once_t _once; |
| // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: dispatch_once_t variables must have static or global storage duration and cannot be Objective-C instance variables [darwin-dispatch-once-nonstatic] |
| // CHECK-FIXES: dispatch_once_t _once; |
| } |
| @end |