@@ -1740,6 +1740,20 @@ static bool isVarDeclOp(const Token* tok)
17401740 return isType (typetok, Token::Match (vartok, " %var%" ));
17411741}
17421742
1743+ static bool isBracketAccess (const Token* tok)
1744+ {
1745+ if (!Token::simpleMatch (tok, " [" ) || !tok->astOperand1 ())
1746+ return false ;
1747+ tok = tok->astOperand1 ();
1748+ if (tok->str () == " ." )
1749+ tok = tok->astOperand2 ();
1750+ while (Token::simpleMatch (tok, " [" ))
1751+ tok = tok->astOperand1 ();
1752+ if (!tok || !tok->variable ())
1753+ return false ;
1754+ return tok->variable ()->nameToken () != tok;
1755+ }
1756+
17431757static bool isConstStatement (const Token *tok, bool cpp)
17441758{
17451759 if (!tok)
@@ -1769,7 +1783,7 @@ static bool isConstStatement(const Token *tok, bool cpp)
17691783 return tok->astParent () ? isConstStatement (tok->astOperand1 (), cpp) && isConstStatement (tok->astOperand2 (), cpp) : isConstStatement (tok->astOperand2 (), cpp);
17701784 if (Token::simpleMatch (tok, " ?" ) && Token::simpleMatch (tok->astOperand2 (), " :" )) // ternary operator
17711785 return isConstStatement (tok->astOperand1 (), cpp) && isConstStatement (tok->astOperand2 ()->astOperand1 (), cpp) && isConstStatement (tok->astOperand2 ()->astOperand2 (), cpp);
1772- if (Token::simpleMatch (tok, " [ " ) && ! Token::Match (tok-> tokAt (- 2 ), " %type% %name% " ) && isWithoutSideEffects (cpp, tok->astOperand1 (), /* checkArrayAccess*/ true )) {
1786+ if (isBracketAccess (tok) && isWithoutSideEffects (cpp, tok->astOperand1 (), /* checkArrayAccess*/ true )) {
17731787 if (Token::simpleMatch (tok->astParent (), " [" ))
17741788 return isConstStatement (tok->astOperand2 (), cpp) && isConstStatement (tok->astParent (), cpp);
17751789 return isConstStatement (tok->astOperand2 (), cpp);
0 commit comments