From 29e4606ced7284c87a88fdcd34a6d179a1350fe9 Mon Sep 17 00:00:00 2001 From: Alexander Shaposhnikov Date: Fri, 28 Oct 2022 05:30:19 +0000 Subject: [PATCH] [clang-tidy] Skip template ctors in modernize-use-equals-default Skip template ctors in modernize-use-equals-default, such constructors may be enabled/disabled via SFINAE, it is not safe to make them "= default". Test plan: ninja check-all Differential revision: https://reviews.llvm.org/D136797 --- .../clang-tidy/modernize/UseEqualsDefaultCheck.cpp | 9 ++++++--- clang-tools-extra/docs/ReleaseNotes.rst | 6 +++--- .../clang-tidy/checkers/modernize/use-equals-default.cpp | 12 ++++++++++++ 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/clang-tools-extra/clang-tidy/modernize/UseEqualsDefaultCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseEqualsDefaultCheck.cpp index 60e0f80..a545fae 100644 --- a/clang-tools-extra/clang-tidy/modernize/UseEqualsDefaultCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/UseEqualsDefaultCheck.cpp @@ -241,7 +241,9 @@ void UseEqualsDefaultCheck::registerMatchers(MatchFinder *Finder) { this); Finder->addMatcher( cxxConstructorDecl( - unless(hasParent(IsUnionLikeClass)), isDefinition(), + unless( + hasParent(decl(anyOf(IsUnionLikeClass, functionTemplateDecl())))), + isDefinition(), anyOf( // Default constructor. allOf(unless(hasAnyConstructorInitializer(isWritten())), @@ -257,8 +259,9 @@ void UseEqualsDefaultCheck::registerMatchers(MatchFinder *Finder) { this); // Copy-assignment operator. Finder->addMatcher( - cxxMethodDecl(unless(hasParent(IsUnionLikeClass)), isDefinition(), - isCopyAssignmentOperator(), + cxxMethodDecl(unless(hasParent( + decl(anyOf(IsUnionLikeClass, functionTemplateDecl())))), + isDefinition(), isCopyAssignmentOperator(), // isCopyAssignmentOperator() allows the parameter to be // passed by value, and in this case it cannot be // defaulted. diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index d7ae8df..c5cc967 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -158,9 +158,9 @@ Changes in existing checks The check now skips unions/union-like classes since in this case a default constructor with empty body is not equivalent to the explicitly defaulted one, variadic constructors since they cannot be explicitly defaulted. The check also skips copy assignment operators - with nonstandard return types, private/protected default constructors for C++17 or earlier. - The automatic fixit has been adjusted to avoid adding superfluous semicolon. - The check is restricted to C++11 or later. + with nonstandard return types, template constructors, private/protected default constructors + for C++17 or earlier. The automatic fixit has been adjusted to avoid adding superfluous + semicolon. The check is restricted to C++11 or later. - Change the default behavior of :doc:`readability-avoid-const-params-in-decls ` to not diff --git a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-equals-default.cpp b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-equals-default.cpp index 7a21ebe..cc5d379 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-equals-default.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-equals-default.cpp @@ -58,6 +58,18 @@ struct VA { VA(...) {} }; +// Skip template constructors. +struct TC { + template + TC() {} + + template + TC(const TC &) {} + + template + TC& operator = (const TC &) { return *this; } +}; + // Initializer or arguments. class IA { public: -- 2.7.4