Index: clang-tidy/modernize/PassByValueCheck.cpp =================================================================== --- clang-tidy/modernize/PassByValueCheck.cpp +++ clang-tidy/modernize/PassByValueCheck.cpp @@ -151,7 +151,8 @@ isCopyConstructor(), unless(isDeleted()), hasDeclContext( cxxRecordDecl(isMoveConstructible()))))))) - .bind("Initializer"))) + .bind("Initializer")), + unless(isCopyConstructor())) .bind("Ctor"), this); } Index: test/clang-tidy/modernize-pass-by-value.cpp =================================================================== --- test/clang-tidy/modernize-pass-by-value.cpp +++ test/clang-tidy/modernize-pass-by-value.cpp @@ -194,3 +194,12 @@ Movable M; }; +// Test exclusion of copy constructors +// allowing modernize-pass-by-value on copy constructors causes: +// - compiler error: copy constructor must pass its first argument by +// reference +// - conflict when applying replacement for both modernize-pass-by-value and +// modernize-use-default +struct T { + T(const T&) {} +};