[clang-tools-extra] [NFC][clang-tidy]refactor isAssignmentToMemberOf in PreferMemberInitializerCheck (PR #71006)

Congcong Cai via cfe-commits cfe-commits at lists.llvm.org
Thu Nov 2 03:45:15 PDT 2023


https://github.com/HerrCai0907 updated https://github.com/llvm/llvm-project/pull/71006

>From 69b7688f56f7fe96031201eef1c3804f391c5abe Mon Sep 17 00:00:00 2001
From: Congcong Cai <congcongcai0907 at 163.com>
Date: Thu, 2 Nov 2023 08:49:22 +0800
Subject: [PATCH 1/2] [NFC][clang-tidy]refactor isAssignmentToMemberOf in
 PreferMemberInitializerCheck

---
 .../PreferMemberInitializerCheck.cpp          | 29 ++++++++++---------
 1 file changed, 15 insertions(+), 14 deletions(-)

diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/PreferMemberInitializerCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/PreferMemberInitializerCheck.cpp
index b6daf8b936bde0f..f0070265e6a734a 100644
--- a/clang-tools-extra/clang-tidy/cppcoreguidelines/PreferMemberInitializerCheck.cpp
+++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/PreferMemberInitializerCheck.cpp
@@ -118,45 +118,45 @@ static void updateAssignmentLevel(
   }
 }
 
-static std::pair<const FieldDecl *, const Expr *>
+static std::optional<std::pair<const FieldDecl *, const Expr *>>
 isAssignmentToMemberOf(const CXXRecordDecl *Rec, const Stmt *S,
                        const CXXConstructorDecl *Ctor) {
   if (const auto *BO = dyn_cast<BinaryOperator>(S)) {
     if (BO->getOpcode() != BO_Assign)
-      return std::make_pair(nullptr, nullptr);
+      return {};
 
     const auto *ME = dyn_cast<MemberExpr>(BO->getLHS()->IgnoreParenImpCasts());
     if (!ME)
-      return std::make_pair(nullptr, nullptr);
+      return {};
 
     const auto *Field = dyn_cast<FieldDecl>(ME->getMemberDecl());
     if (!Field)
-      return std::make_pair(nullptr, nullptr);
+      return {};
 
     if (!isa<CXXThisExpr>(ME->getBase()))
-      return std::make_pair(nullptr, nullptr);
+      return {};
     const Expr *Init = BO->getRHS()->IgnoreParenImpCasts();
     return std::make_pair(Field, Init);
   }
   if (const auto *COCE = dyn_cast<CXXOperatorCallExpr>(S)) {
     if (COCE->getOperator() != OO_Equal)
-      return std::make_pair(nullptr, nullptr);
+      return {};
 
     const auto *ME =
         dyn_cast<MemberExpr>(COCE->getArg(0)->IgnoreParenImpCasts());
     if (!ME)
-      return std::make_pair(nullptr, nullptr);
+      return {};
 
     const auto *Field = dyn_cast<FieldDecl>(ME->getMemberDecl());
     if (!Field)
-      return std::make_pair(nullptr, nullptr);
+      return {};
 
     if (!isa<CXXThisExpr>(ME->getBase()))
-      return std::make_pair(nullptr, nullptr);
+      return {};
     const Expr *Init = COCE->getArg(1)->IgnoreParenImpCasts();
     return std::make_pair(Field, Init);
   }
-  return std::make_pair(nullptr, nullptr);
+  return {};
 }
 
 PreferMemberInitializerCheck::PreferMemberInitializerCheck(
@@ -216,11 +216,12 @@ void PreferMemberInitializerCheck::check(
         return;
     }
 
-    const FieldDecl *Field = nullptr;
-    const Expr *InitValue = nullptr;
-    std::tie(Field, InitValue) = isAssignmentToMemberOf(Class, S, Ctor);
-    if (!Field)
+    std::optional<std::pair<const FieldDecl *, const Expr *>>
+        AssignmentToMember = isAssignmentToMemberOf(Class, S, Ctor);
+    if (!AssignmentToMember)
       continue;
+    const FieldDecl *Field = AssignmentToMember.value().first;
+    const Expr *InitValue = AssignmentToMember.value().second;
     updateAssignmentLevel(Field, InitValue, Ctor, AssignedFields);
     if (!canAdvanceAssignment(AssignedFields[Field]))
       continue;

>From 02201dba276c8d11f324af01ef01d06a04324a4d Mon Sep 17 00:00:00 2001
From: Congcong Cai <congcongcai0907 at 163.com>
Date: Thu, 2 Nov 2023 18:44:01 +0800
Subject: [PATCH 2/2] refactor

---
 .../PreferMemberInitializerCheck.cpp          | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/PreferMemberInitializerCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/PreferMemberInitializerCheck.cpp
index f0070265e6a734a..23d7303371529da 100644
--- a/clang-tools-extra/clang-tidy/cppcoreguidelines/PreferMemberInitializerCheck.cpp
+++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/PreferMemberInitializerCheck.cpp
@@ -118,7 +118,12 @@ static void updateAssignmentLevel(
   }
 }
 
-static std::optional<std::pair<const FieldDecl *, const Expr *>>
+struct AssignmentPair {
+  const FieldDecl *Field;
+  const Expr *Init;
+};
+
+static std::optional<AssignmentPair>
 isAssignmentToMemberOf(const CXXRecordDecl *Rec, const Stmt *S,
                        const CXXConstructorDecl *Ctor) {
   if (const auto *BO = dyn_cast<BinaryOperator>(S)) {
@@ -136,7 +141,7 @@ isAssignmentToMemberOf(const CXXRecordDecl *Rec, const Stmt *S,
     if (!isa<CXXThisExpr>(ME->getBase()))
       return {};
     const Expr *Init = BO->getRHS()->IgnoreParenImpCasts();
-    return std::make_pair(Field, Init);
+    return AssignmentPair{Field, Init};
   }
   if (const auto *COCE = dyn_cast<CXXOperatorCallExpr>(S)) {
     if (COCE->getOperator() != OO_Equal)
@@ -154,7 +159,7 @@ isAssignmentToMemberOf(const CXXRecordDecl *Rec, const Stmt *S,
     if (!isa<CXXThisExpr>(ME->getBase()))
       return {};
     const Expr *Init = COCE->getArg(1)->IgnoreParenImpCasts();
-    return std::make_pair(Field, Init);
+    return AssignmentPair{Field, Init};
   }
   return {};
 }
@@ -216,12 +221,12 @@ void PreferMemberInitializerCheck::check(
         return;
     }
 
-    std::optional<std::pair<const FieldDecl *, const Expr *>>
-        AssignmentToMember = isAssignmentToMemberOf(Class, S, Ctor);
+    std::optional<AssignmentPair> AssignmentToMember =
+        isAssignmentToMemberOf(Class, S, Ctor);
     if (!AssignmentToMember)
       continue;
-    const FieldDecl *Field = AssignmentToMember.value().first;
-    const Expr *InitValue = AssignmentToMember.value().second;
+    const FieldDecl *Field = AssignmentToMember->Field;
+    const Expr *InitValue = AssignmentToMember->Init;
     updateAssignmentLevel(Field, InitValue, Ctor, AssignedFields);
     if (!canAdvanceAssignment(AssignedFields[Field]))
       continue;



More information about the cfe-commits mailing list