1 // RUN: %check_clang_tidy %s bugprone-lambda-function-name %t 2 3 void Foo(const char* a, const char* b, int c) {} 4 5 #define FUNC_MACRO Foo(__func__, "", 0) 6 #define FUNCTION_MACRO Foo(__FUNCTION__, "", 0) 7 #define EMBED_IN_ANOTHER_MACRO1 FUNC_MACRO 8 9 void Positives() { 10 [] { __func__; }(); 11 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: inside a lambda, '__func__' expands to the name of the function call operator; consider capturing the name of the enclosing function explicitly [bugprone-lambda-function-name] 12 [] { __FUNCTION__; }(); 13 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: inside a lambda, '__FUNCTION__' expands to the name of the function call operator; consider capturing the name of the enclosing function explicitly [bugprone-lambda-function-name] 14 [] { FUNC_MACRO; }(); 15 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: inside a lambda, '__func__' expands to the name of the function call operator; consider capturing the name of the enclosing function explicitly [bugprone-lambda-function-name] 16 [] { FUNCTION_MACRO; }(); 17 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: inside a lambda, '__FUNCTION__' expands to the name of the function call operator; consider capturing the name of the enclosing function explicitly [bugprone-lambda-function-name] 18 [] { EMBED_IN_ANOTHER_MACRO1; }(); 19 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: inside a lambda, '__func__' expands to the name of the function call operator; consider capturing the name of the enclosing function explicitly [bugprone-lambda-function-name] 20 } 21 22 #define FUNC_MACRO_WITH_FILE_AND_LINE Foo(__func__, __FILE__, __LINE__) 23 #define FUNCTION_MACRO_WITH_FILE_AND_LINE Foo(__FUNCTION__, __FILE__, __LINE__) 24 #define EMBED_IN_ANOTHER_MACRO2 FUNC_MACRO_WITH_FILE_AND_LINE 25 26 void Negatives() { 27 __func__; 28 __FUNCTION__; 29 30 // __PRETTY_FUNCTION__ should not trigger a warning because its value is 31 // actually potentially useful. 32 __PRETTY_FUNCTION__; 33 [] { __PRETTY_FUNCTION__; }(); 34 35 // Don't warn if __func__/__FUNCTION is used inside a macro that also uses 36 // __FILE__ and __LINE__, on the assumption that __FILE__ and __LINE__ will 37 // be useful even if __func__/__FUNCTION__ is not. 38 [] { FUNC_MACRO_WITH_FILE_AND_LINE; }(); 39 [] { FUNCTION_MACRO_WITH_FILE_AND_LINE; }(); 40 [] { EMBED_IN_ANOTHER_MACRO2; }(); 41 } 42