diff options
author | Alexander Shaposhnikov <ashaposhnikov@google.com> | 2022-10-28 08:30:19 +0300 |
---|---|---|
committer | Alexander Shaposhnikov <ashaposhnikov@google.com> | 2022-10-28 08:30:19 +0300 |
commit | 29e4606ced7284c87a88fdcd34a6d179a1350fe9 (patch) | |
tree | ef38c540b65e40107ac03e561576a70bd1aa73e5 /clang-tools-extra | |
parent | c8eb932ce6408e09c739097b325008c10797846d (diff) |
[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
Diffstat (limited to 'clang-tools-extra')
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 60e0f80da287..a545fae26a3b 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 d7ae8dfdcf36..c5cc967259af 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 <clang-tidy/checks/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 7a21ebe439cc..cc5d379b3c3d 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 <unsigned U> + TC() {} + + template <unsigned U> + TC(const TC &) {} + + template <unsigned U> + TC& operator = (const TC &) { return *this; } +}; + // Initializer or arguments. class IA { public: |