@@ -118,45 +118,50 @@ static void updateAssignmentLevel(
118
118
}
119
119
}
120
120
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>
122
127
isAssignmentToMemberOf (const CXXRecordDecl *Rec, const Stmt *S,
123
128
const CXXConstructorDecl *Ctor) {
124
129
if (const auto *BO = dyn_cast<BinaryOperator>(S)) {
125
130
if (BO->getOpcode () != BO_Assign)
126
- return std::make_pair ( nullptr , nullptr ) ;
131
+ return {} ;
127
132
128
133
const auto *ME = dyn_cast<MemberExpr>(BO->getLHS ()->IgnoreParenImpCasts ());
129
134
if (!ME)
130
- return std::make_pair ( nullptr , nullptr ) ;
135
+ return {} ;
131
136
132
137
const auto *Field = dyn_cast<FieldDecl>(ME->getMemberDecl ());
133
138
if (!Field)
134
- return std::make_pair ( nullptr , nullptr ) ;
139
+ return {} ;
135
140
136
141
if (!isa<CXXThisExpr>(ME->getBase ()))
137
- return std::make_pair ( nullptr , nullptr ) ;
142
+ return {} ;
138
143
const Expr *Init = BO->getRHS ()->IgnoreParenImpCasts ();
139
- return std::make_pair ( Field, Init) ;
144
+ return AssignmentPair{ Field, Init} ;
140
145
}
141
146
if (const auto *COCE = dyn_cast<CXXOperatorCallExpr>(S)) {
142
147
if (COCE->getOperator () != OO_Equal)
143
- return std::make_pair ( nullptr , nullptr ) ;
148
+ return {} ;
144
149
145
150
const auto *ME =
146
151
dyn_cast<MemberExpr>(COCE->getArg (0 )->IgnoreParenImpCasts ());
147
152
if (!ME)
148
- return std::make_pair ( nullptr , nullptr ) ;
153
+ return {} ;
149
154
150
155
const auto *Field = dyn_cast<FieldDecl>(ME->getMemberDecl ());
151
156
if (!Field)
152
- return std::make_pair ( nullptr , nullptr ) ;
157
+ return {} ;
153
158
154
159
if (!isa<CXXThisExpr>(ME->getBase ()))
155
- return std::make_pair ( nullptr , nullptr ) ;
160
+ return {} ;
156
161
const Expr *Init = COCE->getArg (1 )->IgnoreParenImpCasts ();
157
- return std::make_pair ( Field, Init) ;
162
+ return AssignmentPair{ Field, Init} ;
158
163
}
159
- return std::make_pair ( nullptr , nullptr ) ;
164
+ return {} ;
160
165
}
161
166
162
167
PreferMemberInitializerCheck::PreferMemberInitializerCheck (
@@ -216,11 +221,12 @@ void PreferMemberInitializerCheck::check(
216
221
return ;
217
222
}
218
223
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)
223
227
continue ;
228
+ const FieldDecl *Field = AssignmentToMember->Field ;
229
+ const Expr *InitValue = AssignmentToMember->Init ;
224
230
updateAssignmentLevel (Field, InitValue, Ctor, AssignedFields);
225
231
if (!canAdvanceAssignment (AssignedFields[Field]))
226
232
continue ;
0 commit comments