valueFlowContainerSize: handling of 'v.size() == 10'
This commit is contained in:
parent
3947c23290
commit
2b10e38eec
|
@ -3460,21 +3460,27 @@ static void valueFlowContainerSize(TokenList * /*tokenlist*/, SymbolDatabase* sy
|
|||
continue;
|
||||
|
||||
const Token *conditionToken;
|
||||
MathLib::bigint intval;
|
||||
|
||||
if (tok->valueType()->container->getYield(tok->strAt(2)) == Library::Container::Yield::SIZE) {
|
||||
const Token *parent = tok->tokAt(3)->astParent();
|
||||
if (!parent || !parent->isComparisonOp() || !parent->astOperand2())
|
||||
continue;
|
||||
if (parent->astOperand1()->str() != "0" && parent->astOperand2()->str() != "0")
|
||||
if (parent->astOperand1()->hasKnownIntValue())
|
||||
intval = parent->astOperand1()->values().front().intvalue;
|
||||
else if (parent->astOperand2()->hasKnownIntValue())
|
||||
intval = parent->astOperand2()->values().front().intvalue;
|
||||
else
|
||||
continue;
|
||||
conditionToken = parent;
|
||||
} else if (tok->valueType()->container->getYield(tok->strAt(2)) == Library::Container::Yield::EMPTY) {
|
||||
conditionToken = tok->tokAt(3);
|
||||
intval = 0;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
|
||||
ValueFlow::Value value(conditionToken, 0LL);
|
||||
ValueFlow::Value value(conditionToken, intval);
|
||||
value.valueType = ValueFlow::Value::ValueType::CONTAINER_SIZE;
|
||||
valueFlowContainerReverse(scope.classDef, tok->varId(), value, settings);
|
||||
}
|
||||
|
|
|
@ -3277,6 +3277,16 @@ private:
|
|||
"}";
|
||||
values = tokenValues(code, "ints . front");
|
||||
ASSERT_EQUALS(true, values.empty());
|
||||
|
||||
code = "void f(std::vector<int> v) {\n"
|
||||
" v[10] = 0;\n"
|
||||
" if (v.size() == 10) {}\n"
|
||||
"}";
|
||||
values = tokenValues(code, "v [");
|
||||
ASSERT_EQUALS(1, values.size());
|
||||
ASSERT_EQUALS(true, values.empty() ? true : values.front().isContainerSizeValue());
|
||||
ASSERT_EQUALS(10, values.empty() ? 10 : values.front().intvalue);
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue