1// RUN: %check_clang_tidy %s darwin-dispatch-once-nonstatic %t 2 3typedef int dispatch_once_t; 4extern void dispatch_once(dispatch_once_t *pred, void(^block)(void)); 5 6 7void bad_dispatch_once(dispatch_once_t once, void(^block)(void)) {} 8// 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] 9 10// file-scope dispatch_once_ts have static storage duration. 11dispatch_once_t global_once; 12static dispatch_once_t file_static_once; 13namespace { 14dispatch_once_t anonymous_once; 15} // end anonymous namespace 16 17int Correct(void) { 18 static int value; 19 static dispatch_once_t once; 20 dispatch_once(&once, ^{ 21 value = 1; 22 }); 23 return value; 24} 25 26int Incorrect(void) { 27 static int value; 28 dispatch_once_t once; 29 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: dispatch_once_t variables must have static or global storage duration [darwin-dispatch-once-nonstatic] 30 // CHECK-FIXES: static dispatch_once_t once; 31 dispatch_once(&once, ^{ 32 value = 1; 33 }); 34 return value; 35} 36 37struct OnceStruct { 38 static dispatch_once_t staticOnce; // Allowed 39 int value; 40 dispatch_once_t once; // Allowed (at this time) 41}; 42 43@interface MyObject { 44 dispatch_once_t _once; 45 // 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] 46 // CHECK-FIXES: dispatch_once_t _once; 47} 48@end 49