Refactoring; Check structured binding in isVariableChanged()
This commit is contained in:
parent
895a96f9dd
commit
32b28d568f
|
@ -1890,6 +1890,22 @@ bool isVariableChanged(const Token *tok, int indirect, const Settings *settings,
|
||||||
if (parent && parent->tokType() == Token::eIncDecOp)
|
if (parent && parent->tokType() == Token::eIncDecOp)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
// structured binding, nonconst reference variable in lhs
|
||||||
|
if (Token::Match(tok2->astParent(), ":|=") && tok2 == tok2->astParent()->astOperand2() && Token::simpleMatch(tok2->astParent()->previous(), "]")) {
|
||||||
|
const Token *typeStart = tok2->astParent()->previous()->link()->previous();
|
||||||
|
if (Token::simpleMatch(typeStart, "&"))
|
||||||
|
typeStart = typeStart->previous();
|
||||||
|
if (typeStart && Token::Match(typeStart->previous(), "[;{}(] auto &| [")) {
|
||||||
|
for (const Token *vartok = typeStart->tokAt(2); vartok != tok2; vartok = vartok->next()) {
|
||||||
|
if (vartok->varId()) {
|
||||||
|
const Variable* refvar = vartok->variable();
|
||||||
|
if (!refvar || (!refvar->isConst() && refvar->isReference()))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (Token::simpleMatch(tok2->astParent(), ":") && tok2->astParent()->astParent() && Token::simpleMatch(tok2->astParent()->astParent()->previous(), "for (")) {
|
if (Token::simpleMatch(tok2->astParent(), ":") && tok2->astParent()->astParent() && Token::simpleMatch(tok2->astParent()->astParent()->previous(), "for (")) {
|
||||||
const Token * varTok = tok2->astParent()->previous();
|
const Token * varTok = tok2->astParent()->previous();
|
||||||
if (!varTok)
|
if (!varTok)
|
||||||
|
|
|
@ -1419,28 +1419,6 @@ void CheckOther::checkConstVariable()
|
||||||
usedInAssignment = true;
|
usedInAssignment = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if (Token::Match(tok, "auto &| [")) {
|
|
||||||
// structured binding taking reference..
|
|
||||||
const Token *tok2 = tok->next();
|
|
||||||
if (tok2->str() == "&")
|
|
||||||
tok2 = tok2->next();
|
|
||||||
tok2 = tok2->link();
|
|
||||||
if (Token::Match(tok2, "] [:=] %varid% [);]", var->declarationId())) {
|
|
||||||
if (tok->next()->str() == "&") {
|
|
||||||
usedInAssignment = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
while (tok2 != tok) {
|
|
||||||
if (tok2->varId()) {
|
|
||||||
const Variable* refvar = tok2->variable();
|
|
||||||
if (!refvar || (!refvar->isConst() && refvar->isReference())) {
|
|
||||||
usedInAssignment = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tok2 = tok2->previous();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (usedInAssignment)
|
if (usedInAssignment)
|
||||||
|
|
Loading…
Reference in New Issue