@@ -551,11 +551,14 @@ bool extractForLoopValues(const Token *forToken,
551551
552552static const Token * getVariableInitExpression (const Variable * var)
553553{
554- if (!var || !var->declEndToken ())
554+ if (!var)
555+ return nullptr ;
556+ const Token *varDeclEndToken = var->declEndToken ();
557+ if (!varDeclEndToken)
555558 return nullptr ;
556- if (Token::Match (var-> declEndToken () , " ; %varid% =" , var->declarationId ()))
557- return var-> declEndToken () ->tokAt (2 )->astOperand2 ();
558- return var-> declEndToken () ->astOperand2 ();
559+ if (Token::Match (varDeclEndToken , " ; %varid% =" , var->declarationId ()))
560+ return varDeclEndToken ->tokAt (2 )->astOperand2 ();
561+ return varDeclEndToken ->astOperand2 ();
559562}
560563
561564static bool isInLoopCondition (const Token * tok)
@@ -729,13 +732,6 @@ static void followVariableExpressionError(const Token *tok1, const Token *tok2,
729732 errors->push_back (item);
730733}
731734
732- static void findTokenValue (const Token* const tok, std::function<bool (const ValueFlow::Value &)> pred, std::function<void(const ValueFlow::Value &)> f)
733- {
734- auto x = std::find_if (tok->values ().begin (), tok->values ().end (), pred);
735- if (x != tok->values ().end ())
736- f (*x);
737- }
738-
739735static bool isSameLifetime (const Token * const tok1, const Token * const tok2)
740736{
741737 ValueFlow::Value v1 = getLifetimeObjValue (tok1);
@@ -747,18 +743,23 @@ static bool isSameLifetime(const Token * const tok1, const Token * const tok2)
747743
748744static bool compareKnownValue (const Token * const tok1, const Token * const tok2, std::function<bool (const ValueFlow::Value&, const ValueFlow::Value&, bool )> compare)
749745{
750- bool result = false ;
751- bool sameLifetime = isSameLifetime (tok1, tok2);
752- findTokenValue (tok1, std::mem_fn (&ValueFlow::Value::isKnown), [&](const ValueFlow::Value& v1) {
753- if (v1.isNonValue () || v1.isContainerSizeValue ())
754- return ;
755- findTokenValue (tok2, std::mem_fn (&ValueFlow::Value::isKnown), [&](const ValueFlow::Value& v2) {
756- if (v1.valueType == v2.valueType ) {
757- result = compare (v1, v2, sameLifetime);
758- }
759- });
760- });
761- return result;
746+ static const auto isKnownFn = std::mem_fn (&ValueFlow::Value::isKnown);
747+
748+ const auto v1 = std::find_if (tok1->values ().begin (), tok1->values ().end (), isKnownFn);
749+ if (v1 == tok1->values ().end ()) {
750+ return false ;
751+ }
752+ if (v1->isNonValue () || v1->isContainerSizeValue ())
753+ return false ;
754+ const auto v2 = std::find_if (tok2->values ().begin (), tok2->values ().end (), isKnownFn);
755+ if (v2 == tok2->values ().end ()) {
756+ return false ;
757+ }
758+ if (v1->valueType != v2->valueType ) {
759+ return false ;
760+ }
761+ const bool sameLifetime = isSameLifetime (tok1, tok2);
762+ return compare (*v1, *v2, sameLifetime);
762763}
763764
764765bool isEqualKnownValue (const Token * const tok1, const Token * const tok2)
0 commit comments