@@ -118,45 +118,50 @@ static void updateAssignmentLevel(
118118 }
119119}
120120
121- static std::pair<const FieldDecl *, const Expr *>
121+ struct AssignmentPair {
122+ const FieldDecl *Field;
123+ const Expr *Init;
124+ };
125+
126+ static std::optional<AssignmentPair>
122127isAssignmentToMemberOf (const CXXRecordDecl *Rec, const Stmt *S,
123128 const CXXConstructorDecl *Ctor) {
124129 if (const auto *BO = dyn_cast<BinaryOperator>(S)) {
125130 if (BO->getOpcode () != BO_Assign)
126- return std::make_pair ( nullptr , nullptr ) ;
131+ return {} ;
127132
128133 const auto *ME = dyn_cast<MemberExpr>(BO->getLHS ()->IgnoreParenImpCasts ());
129134 if (!ME)
130- return std::make_pair ( nullptr , nullptr ) ;
135+ return {} ;
131136
132137 const auto *Field = dyn_cast<FieldDecl>(ME->getMemberDecl ());
133138 if (!Field)
134- return std::make_pair ( nullptr , nullptr ) ;
139+ return {} ;
135140
136141 if (!isa<CXXThisExpr>(ME->getBase ()))
137- return std::make_pair ( nullptr , nullptr ) ;
142+ return {} ;
138143 const Expr *Init = BO->getRHS ()->IgnoreParenImpCasts ();
139- return std::make_pair ( Field, Init) ;
144+ return AssignmentPair{ Field, Init} ;
140145 }
141146 if (const auto *COCE = dyn_cast<CXXOperatorCallExpr>(S)) {
142147 if (COCE->getOperator () != OO_Equal)
143- return std::make_pair ( nullptr , nullptr ) ;
148+ return {} ;
144149
145150 const auto *ME =
146151 dyn_cast<MemberExpr>(COCE->getArg (0 )->IgnoreParenImpCasts ());
147152 if (!ME)
148- return std::make_pair ( nullptr , nullptr ) ;
153+ return {} ;
149154
150155 const auto *Field = dyn_cast<FieldDecl>(ME->getMemberDecl ());
151156 if (!Field)
152- return std::make_pair ( nullptr , nullptr ) ;
157+ return {} ;
153158
154159 if (!isa<CXXThisExpr>(ME->getBase ()))
155- return std::make_pair ( nullptr , nullptr ) ;
160+ return {} ;
156161 const Expr *Init = COCE->getArg (1 )->IgnoreParenImpCasts ();
157- return std::make_pair ( Field, Init) ;
162+ return AssignmentPair{ Field, Init} ;
158163 }
159- return std::make_pair ( nullptr , nullptr ) ;
164+ return {} ;
160165}
161166
162167PreferMemberInitializerCheck::PreferMemberInitializerCheck (
@@ -216,11 +221,12 @@ void PreferMemberInitializerCheck::check(
216221 return ;
217222 }
218223
219- const FieldDecl *Field = nullptr ;
220- const Expr *InitValue = nullptr ;
221- std::tie (Field, InitValue) = isAssignmentToMemberOf (Class, S, Ctor);
222- if (!Field)
224+ std::optional<AssignmentPair> AssignmentToMember =
225+ isAssignmentToMemberOf (Class, S, Ctor);
226+ if (!AssignmentToMember)
223227 continue ;
228+ const FieldDecl *Field = AssignmentToMember->Field ;
229+ const Expr *InitValue = AssignmentToMember->Init ;
224230 updateAssignmentLevel (Field, InitValue, Ctor, AssignedFields);
225231 if (!canAdvanceAssignment (AssignedFields[Field]))
226232 continue ;
0 commit comments