Index: clang-tidy/performance/UnnecessaryValueParamCheck.cpp =================================================================== --- clang-tidy/performance/UnnecessaryValueParamCheck.cpp +++ clang-tidy/performance/UnnecessaryValueParamCheck.cpp @@ -79,6 +79,10 @@ Options.getLocalOrGlobal("IncludeStyle", "llvm"))) {} void UnnecessaryValueParamCheck::registerMatchers(MatchFinder *Finder) { + // This check is specific to C++ and doesn't apply to languages like + // Objective-C. + if (!getLangOpts().CPlusPlus) + return; const auto ExpensiveValueParamDecl = parmVarDecl(hasType(hasCanonicalType(allOf( unless(referenceType()), matchers::isExpensiveToCopy()))), Index: clang-tidy/utils/TypeTraits.cpp =================================================================== --- clang-tidy/utils/TypeTraits.cpp +++ clang-tidy/utils/TypeTraits.cpp @@ -45,7 +45,8 @@ return llvm::None; return !Type.isTriviallyCopyableType(Context) && !classHasTrivialCopyAndDestroy(Type) && - !hasDeletedCopyConstructor(Type); + !hasDeletedCopyConstructor(Type) && + !Type->isObjCLifetimeType(); } bool recordIsTriviallyDefaultConstructible(const RecordDecl &RecordDecl, Index: test/clang-tidy/performance-unnecessary-value-param-arc.m =================================================================== --- /dev/null +++ test/clang-tidy/performance-unnecessary-value-param-arc.m @@ -0,0 +1,16 @@ +// RUN: clang-tidy %s -checks=-*,performance-unnecessary-value-param -- \ +// RUN: -xobjective-c -fobjc-abi-version=2 -fobjc-arc | count 0 + +#if !__has_feature(objc_arc) +#error Objective-C ARC not enabled as expected +#endif + +// Passing an Objective-C ARC-managed object to a C function should +// not raise performance-unnecessary-value-param. +void foo(id object) { } + +// Same for explcitly non-ARC-managed Objective-C objects. +void bar(__unsafe_unretained id object) { } + +// Same for Objective-c classes. +void baz(Class c) { } Index: test/clang-tidy/performance-unnecessary-value-param-arc.mm =================================================================== --- /dev/null +++ test/clang-tidy/performance-unnecessary-value-param-arc.mm @@ -0,0 +1,16 @@ +// RUN: clang-tidy %s -checks=-*,performance-unnecessary-value-param -- \ +// RUN: -xobjective-c++ -fobjc-abi-version=2 -fobjc-arc | count 0 + +#if !__has_feature(objc_arc) +#error Objective-C ARC not enabled as expected +#endif + +// Passing an Objective-C ARC-managed object to a C function should +// not raise performance-unnecessary-value-param. +void foo(id object) { } + +// Same for explcitly non-ARC-managed Objective-C objects. +void bar(__unsafe_unretained id object) { } + +// Same for Objective-c classes. +void baz(Class c) { }