[clang-tools-extra] 4450348 - [clang-tidy] Skip union-like classes in use-equals-default
Alexander Shaposhnikov via cfe-commits
cfe-commits at lists.llvm.org
Tue Sep 6 13:20:47 PDT 2022
Author: Alexander Shaposhnikov
Date: 2022-09-06T20:19:47Z
New Revision: 44503482e0af189d3a7fc57b80238ea4151992b9
URL: https://github.com/llvm/llvm-project/commit/44503482e0af189d3a7fc57b80238ea4151992b9
DIFF: https://github.com/llvm/llvm-project/commit/44503482e0af189d3a7fc57b80238ea4151992b9.diff
LOG: [clang-tidy] Skip union-like classes in use-equals-default
Skip unions/union-like classes since in this case constructors
with empty bodies behave differently in comparison with regular
structs/classes.
Test plan: ninja check-clang-tools
Differential revision: https://reviews.llvm.org/D132713
Added:
Modified:
clang-tools-extra/clang-tidy/modernize/UseEqualsDefaultCheck.cpp
clang-tools-extra/docs/ReleaseNotes.rst
clang-tools-extra/test/clang-tidy/checkers/modernize/use-equals-default-copy.cpp
clang-tools-extra/test/clang-tidy/checkers/modernize/use-equals-default.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clang-tidy/modernize/UseEqualsDefaultCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseEqualsDefaultCheck.cpp
index 2de677d2735fe..d5c402c4bdeb7 100644
--- a/clang-tools-extra/clang-tidy/modernize/UseEqualsDefaultCheck.cpp
+++ b/clang-tools-extra/clang-tidy/modernize/UseEqualsDefaultCheck.cpp
@@ -218,17 +218,20 @@ void UseEqualsDefaultCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
}
void UseEqualsDefaultCheck::registerMatchers(MatchFinder *Finder) {
- // Skip unions since constructors with empty bodies behave
diff erently
- // in comparison with structs/classes.
+ // Skip unions/union-like classes since their constructors behave
diff erently
+ // when defaulted vs. empty.
+ auto IsUnionLikeClass = recordDecl(
+ anyOf(isUnion(),
+ has(fieldDecl(isImplicit(), hasType(cxxRecordDecl(isUnion()))))));
// Destructor.
- Finder->addMatcher(cxxDestructorDecl(unless(hasParent(recordDecl(isUnion()))),
- isDefinition())
- .bind(SpecialFunction),
- this);
+ Finder->addMatcher(
+ cxxDestructorDecl(unless(hasParent(IsUnionLikeClass)), isDefinition())
+ .bind(SpecialFunction),
+ this);
Finder->addMatcher(
cxxConstructorDecl(
- unless(hasParent(recordDecl(isUnion()))), isDefinition(),
+ unless(hasParent(IsUnionLikeClass)), isDefinition(),
anyOf(
// Default constructor.
allOf(unless(hasAnyConstructorInitializer(isWritten())),
@@ -243,7 +246,7 @@ void UseEqualsDefaultCheck::registerMatchers(MatchFinder *Finder) {
this);
// Copy-assignment operator.
Finder->addMatcher(
- cxxMethodDecl(unless(hasParent(recordDecl(isUnion()))), isDefinition(),
+ cxxMethodDecl(unless(hasParent(IsUnionLikeClass)), isDefinition(),
isCopyAssignmentOperator(),
// isCopyAssignmentOperator() allows the parameter to be
// passed by value, and in this case it cannot be
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 7c91ea00dca84..89dd7e746e587 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -144,9 +144,10 @@ Changes in existing checks
- Improved :doc:`modernize-use-equals-default <clang-tidy/checks/modernize/use-equals-default>`
check.
- The check now skips unions since in this case a default constructor with empty body
- is not equivalent to the explicitly defaulted one. The check also skips copy assignment
- operators with nonstandard return types. The check is restricted to c++11-or-later.
+ 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. The check also skips
+ copy assignment operators with nonstandard return types. The check is restricted to
+ c++11-or-later.
Removed checks
^^^^^^^^^^^^^^
diff --git a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-equals-default-copy.cpp b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-equals-default-copy.cpp
index 70fc521ebb7ae..eaa600ad86438 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-equals-default-copy.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-equals-default-copy.cpp
@@ -44,6 +44,20 @@ union NU {
IL Field;
};
+// Skip structs/classes containing anonymous unions.
+struct SU {
+ SU(const SU &Other) : Field(Other.Field) {}
+ // CHECK-FIXES: SU(const SU &Other) :
+ SU &operator=(const SU &Other) {
+ Field = Other.Field;
+ return *this;
+ }
+ // CHECK-FIXES: SU &operator=(const SU &Other) {
+ union {
+ IL Field;
+ };
+};
+
// Wrong type.
struct WT {
WT(const IL &Other) {}
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 1de4957ceb1b9..ba252792cf3a6 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
@@ -42,6 +42,17 @@ union NU {
NE Field;
};
+// Skip structs/classes containing anonymous unions.
+struct SU {
+ SU() {}
+ // CHECK-FIXES: SU() {}
+ ~SU() {}
+ // CHECK-FIXES: ~SU() {}
+ union {
+ NE Field;
+ };
+};
+
// Initializer or arguments.
class IA {
public:
More information about the cfe-commits
mailing list