@@ -201,7 +201,8 @@ namespace {
201201
202202 template <class T , class F , REQUIRES(" T must be a Token class" , std::is_convertible<T*, const Token*> )>
203203 Progress traverseConditional (T* tok, F f, bool traverseUnknown) {
204- if (Token::Match (tok, " ?|&&|%oror%" ) && tok->astOperand1 () && tok->astOperand2 ()) {
204+ Analyzer::Action action = analyzer->analyze (tok, Analyzer::Direction::Forward);
205+ if (action.isNone () && Token::Match (tok, " ?|&&|%oror%" ) && tok->astOperand1 () && tok->astOperand2 ()) {
205206 const T* condTok = tok->astOperand1 ();
206207 T* childTok = tok->astOperand2 ();
207208 bool checkThen, checkElse;
@@ -226,12 +227,19 @@ namespace {
226227 if (traverseRecursive (childTok, f, traverseUnknown) == Progress::Break)
227228 return Break ();
228229 }
230+ } else {
231+ return f (tok, action);
229232 }
230233 return Progress::Continue;
231234 }
232235
233236 Progress update (Token* tok) {
234237 Analyzer::Action action = analyzer->analyze (tok, Analyzer::Direction::Forward);
238+ return update (tok, action);
239+ }
240+
241+ Progress update (Token* tok, Analyzer::Action action)
242+ {
235243 actions |= action;
236244 if (!action.isNone () && !analyzeOnly)
237245 analyzer->update (tok, action, Analyzer::Direction::Forward);
@@ -245,29 +253,54 @@ namespace {
245253 return Progress::Continue;
246254 }
247255
256+ struct AsUpdate {
257+ ForwardTraversal* self = nullptr ;
258+
259+ explicit AsUpdate (ForwardTraversal* self) : self(self) {}
260+
261+ template <class ... Ts>
262+ Progress operator ()(Ts... xs) const
263+ {
264+ assert (self);
265+ return self->update (xs ...);
266+ }
267+ };
268+
248269 Progress updateTok (Token* tok, Token** out = nullptr ) {
249- auto f = [this ](Token* tok2) {
250- return update (tok2);
251- };
252- return traverseTok (tok, f, false , out);
270+ return traverseTok (tok, AsUpdate{this }, false , out);
253271 }
254272
255273 Progress updateRecursive (Token* tok) {
256- auto f = [this ](Token* tok2) {
257- return update (tok2);
258- };
259- return traverseRecursive (tok, f, false );
274+ return traverseRecursive (tok, AsUpdate{this }, false );
260275 }
261276
277+ struct AsAnalyze {
278+ ForwardTraversal* self = nullptr ;
279+ Analyzer::Action* result = nullptr ;
280+
281+ AsAnalyze (ForwardTraversal* self, Analyzer::Action* result) : self(self), result(result) {}
282+
283+ Progress operator ()(const Token* tok) const
284+ {
285+ assert (self);
286+ assert (result);
287+ return (*this )(tok, self->analyzer ->analyze (tok, Analyzer::Direction::Forward));
288+ }
289+
290+ Progress operator ()(const Token* /* unused*/ , Analyzer::Action action) const
291+ {
292+ assert (self);
293+ assert (result);
294+ *result = action;
295+ if (result->isModified () || result->isInconclusive ())
296+ return self->Break ();
297+ return Progress::Continue;
298+ }
299+ };
300+
262301 Analyzer::Action analyzeRecursive (const Token* start) {
263302 Analyzer::Action result = Analyzer::Action::None;
264- auto f = [&](const Token* tok) {
265- result = analyzer->analyze (tok, Analyzer::Direction::Forward);
266- if (result.isModified () || result.isInconclusive ())
267- return Break ();
268- return Progress::Continue;
269- };
270- traverseRecursive (start, f, true );
303+ traverseRecursive (start, AsAnalyze{this , &result}, true );
271304 return result;
272305 }
273306
0 commit comments