diff --git a/clang-tools-extra/clang-tidy/google/FunctionNamingCheck.cpp b/clang-tools-extra/clang-tidy/google/FunctionNamingCheck.cpp --- a/clang-tools-extra/clang-tidy/google/FunctionNamingCheck.cpp +++ b/clang-tools-extra/clang-tidy/google/FunctionNamingCheck.cpp @@ -93,12 +93,16 @@ if (!getLangOpts().ObjC) return; - // Match function declarations that are not in system headers and are not - // main. + // Enforce Objective-C function naming conventions on all functions except: + // • Functions defined in system headers. + // • C++ member functions. + // • Namespaced functions. + // • Implicitly defined functions. + // • The main function. Finder->addMatcher( functionDecl( unless(anyOf(isExpansionInSystemHeader(), cxxMethodDecl(), - hasAncestor(namespaceDecl()), isMain(), + hasAncestor(namespaceDecl()), isMain(), isImplicit(), matchesName(validFunctionNameRegex(true)), allOf(isStaticStorageClass(), matchesName(validFunctionNameRegex(false)))))) diff --git a/clang-tools-extra/test/clang-tidy/google-objc-function-naming.m b/clang-tools-extra/test/clang-tidy/google-objc-function-naming.m --- a/clang-tools-extra/test/clang-tidy/google-objc-function-naming.m +++ b/clang-tools-extra/test/clang-tidy/google-objc-function-naming.m @@ -1,5 +1,20 @@ // RUN: %check_clang_tidy %s google-objc-function-naming %t +// Declare a builtin function so that we can invoke the function below to +// generate an implicit function declaration (we intentionally do not import +// as we cannot guarantee its availability). +// +// google-objc-function-naming is suppressed for this declaration as it must +// match the builtin function declaration. Under normal conditions, this +// function would be declared in a system header. +int printf(const char *, ...); // NOLINT(google-objc-function-naming) + +static void TestImplicitFunctionDeclaration(int a) { + // Call a builtin function so that the compiler generates an implicit + // function declaration. + printf("%d", a); +} + typedef _Bool bool; static bool ispositive(int a) { return a > 0; }