@@ -1053,21 +1053,8 @@ static bool hasFunctionCall(const Token *tok)
10531053 return hasFunctionCall (tok->astOperand1 ()) || hasFunctionCall (tok->astOperand2 ());
10541054}
10551055
1056- FwdAnalysis::Result FwdAnalysis::checkRecursive (const Token *assign1 , const Token *startToken, const Token *endToken)
1056+ FwdAnalysis::Result FwdAnalysis::checkRecursive (const Token *expr , const Token *startToken, const Token *endToken, const std::set< unsigned int > &exprVarIds, bool local )
10571057{
1058- // all variable ids in assign1 LHS.
1059- std::set<unsigned int > assign1LhsVarIds;
1060- bool local = true ;
1061- visitAstNodes (assign1->astOperand1 (),
1062- [&](const Token *tok) {
1063- if (tok->varId () > 0 ) {
1064- assign1LhsVarIds.insert (tok->varId ());
1065- if (!Token::simpleMatch (tok->previous (), " ." ))
1066- local &= !nonLocal (tok->variable ());
1067- }
1068- return ChildrenToVisit::op1_and_op2;
1069- });
1070-
10711058 // Parse the given tokens
10721059 for (const Token *tok = startToken; tok != endToken; tok = tok->next ()) {
10731060 if (Token::simpleMatch (tok, " try {" )) {
@@ -1101,7 +1088,7 @@ FwdAnalysis::Result FwdAnalysis::checkRecursive(const Token *assign1, const Toke
11011088 return Result (Result::Type::BAILOUT);
11021089 }
11031090
1104- if (assign1LhsVarIds .find (tok->varId ()) != assign1LhsVarIds .end ()) {
1091+ if (exprVarIds .find (tok->varId ()) != exprVarIds .end ()) {
11051092 const Token *parent = tok;
11061093 while (Token::Match (parent->astParent (), " .|::|[" ))
11071094 parent = parent->astParent ();
@@ -1110,10 +1097,10 @@ FwdAnalysis::Result FwdAnalysis::checkRecursive(const Token *assign1, const Toke
11101097 // TODO: this is a quick bailout
11111098 return Result (Result::Type::BAILOUT);
11121099 }
1113- if (hasOperand (parent->astParent ()->astOperand2 (), assign1-> astOperand1 () )) {
1100+ if (hasOperand (parent->astParent ()->astOperand2 (), expr )) {
11141101 return Result (Result::Type::READ);
11151102 }
1116- const bool reassign = isSameExpression (mCpp , false , assign1-> astOperand1 () , parent, mLibrary , false , false , nullptr );
1103+ const bool reassign = isSameExpression (mCpp , false , expr , parent, mLibrary , false , false , nullptr );
11171104 if (reassign)
11181105 return Result (Result::Type::WRITE, parent->astParent ());
11191106 return Result (Result::Type::READ);
@@ -1124,12 +1111,12 @@ FwdAnalysis::Result FwdAnalysis::checkRecursive(const Token *assign1, const Toke
11241111 }
11251112
11261113 if (Token::Match (tok, " ) {" )) {
1127- const Result &result1 = checkRecursive (assign1 , tok->tokAt (2 ), tok->linkAt (1 ));
1114+ const Result &result1 = checkRecursive (expr , tok->tokAt (2 ), tok->linkAt (1 ), exprVarIds, local );
11281115 if (result1.type == Result::Type::READ || result1.type == Result::Type::BAILOUT)
11291116 return result1;
11301117 if (Token::simpleMatch (tok->linkAt (1 ), " } else {" )) {
11311118 const Token *elseStart = tok->linkAt (1 )->tokAt (2 );
1132- const Result &result2 = checkRecursive (assign1 , elseStart, elseStart->link ());
1119+ const Result &result2 = checkRecursive (expr , elseStart, elseStart->link (), exprVarIds, local );
11331120 if (result2.type == Result::Type::READ || result2.type == Result::Type::BAILOUT)
11341121 return result2;
11351122 if (result1.type == Result::Type::WRITE && result2.type == Result::Type::WRITE)
@@ -1144,9 +1131,22 @@ FwdAnalysis::Result FwdAnalysis::checkRecursive(const Token *assign1, const Toke
11441131 return Result (Result::Type::NONE);
11451132}
11461133
1147- FwdAnalysis::Result FwdAnalysis::check (const Token *assign1 , const Token *startToken, const Token *endToken)
1134+ FwdAnalysis::Result FwdAnalysis::check (const Token *expr , const Token *startToken, const Token *endToken)
11481135{
1149- Result result = checkRecursive (assign1, startToken, endToken);
1136+ // all variable ids in expr.
1137+ std::set<unsigned int > exprVarIds;
1138+ bool local = true ;
1139+ visitAstNodes (expr,
1140+ [&](const Token *tok) {
1141+ if (tok->varId () > 0 ) {
1142+ exprVarIds.insert (tok->varId ());
1143+ if (!Token::simpleMatch (tok->previous (), " ." ))
1144+ local &= !nonLocal (tok->variable ());
1145+ }
1146+ return ChildrenToVisit::op1_and_op2;
1147+ });
1148+
1149+ Result result = checkRecursive (expr, startToken, endToken, exprVarIds, local);
11501150
11511151 // Break => continue checking in outer scope
11521152 while (result.type == FwdAnalysis::Result::Type::BREAK) {
@@ -1155,7 +1155,7 @@ FwdAnalysis::Result FwdAnalysis::check(const Token *assign1, const Token *startT
11551155 s = s->nestedIn ;
11561156 if (s->type != Scope::eSwitch)
11571157 break ;
1158- result = checkRecursive (assign1 , s->bodyEnd ->next (), endToken);
1158+ result = checkRecursive (expr , s->bodyEnd ->next (), endToken, exprVarIds, local );
11591159 }
11601160
11611161 return result;
0 commit comments