@@ -126,32 +126,31 @@ namespace ValueFlow
126126 return value.isIntValue() || value.isFloatValue();
127127 }
128128
129- static void setTokenValueCast(Token *parent, const ValueType &valueType, const Value & value, const Settings &settings)
129+ static void setTokenValueCast(Token *parent, const ValueType &valueType, Value value, const Settings &settings)
130130 {
131131 if (valueType.pointer || value.isImpossible())
132- setTokenValue(parent,value,settings);
132+ setTokenValue(parent,std::move( value) ,settings);
133133 else if (valueType.type == ValueType::Type::CHAR)
134- setTokenValue(parent, castValue(value, valueType.sign, settings.platform.char_bit), settings);
134+ setTokenValue(parent, castValue(std::move( value) , valueType.sign, settings.platform.char_bit), settings);
135135 else if (valueType.type == ValueType::Type::SHORT)
136- setTokenValue(parent, castValue(value, valueType.sign, settings.platform.short_bit), settings);
136+ setTokenValue(parent, castValue(std::move( value) , valueType.sign, settings.platform.short_bit), settings);
137137 else if (valueType.type == ValueType::Type::INT)
138- setTokenValue(parent, castValue(value, valueType.sign, settings.platform.int_bit), settings);
138+ setTokenValue(parent, castValue(std::move( value) , valueType.sign, settings.platform.int_bit), settings);
139139 else if (valueType.type == ValueType::Type::LONG)
140- setTokenValue(parent, castValue(value, valueType.sign, settings.platform.long_bit), settings);
140+ setTokenValue(parent, castValue(std::move( value) , valueType.sign, settings.platform.long_bit), settings);
141141 else if (valueType.type == ValueType::Type::LONGLONG)
142- setTokenValue(parent, castValue(value, valueType.sign, settings.platform.long_long_bit), settings);
142+ setTokenValue(parent, castValue(std::move( value) , valueType.sign, settings.platform.long_long_bit), settings);
143143 else if (valueType.isFloat() && isNumeric(value)) {
144- Value floatValue = value;
145- floatValue.valueType = Value::ValueType::FLOAT;
146144 if (value.isIntValue())
147- floatValue.floatValue = static_cast<double>(value.intvalue);
148- setTokenValue(parent, std::move(floatValue), settings);
145+ value.floatValue = static_cast<double>(value.intvalue);
146+ value.valueType = Value::ValueType::FLOAT;
147+ setTokenValue(parent, std::move(value), settings);
149148 } else if (value.isIntValue()) {
150149 const long long charMax = settings.platform.signedCharMax();
151150 const long long charMin = settings.platform.signedCharMin();
152151 if (charMin <= value.intvalue && value.intvalue <= charMax) {
153152 // unknown type, but value is small so there should be no truncation etc
154- setTokenValue(parent,value,settings);
153+ setTokenValue(parent,std::move( value) ,settings);
155154 }
156155 }
157156 }
@@ -307,22 +306,23 @@ namespace ValueFlow
307306 value.valueType = Value::ValueType::INT;
308307 setTokenValue(next, std::move(value), settings);
309308 } else if (yields == Library::Container::Yield::EMPTY) {
310- Value v(value);
311- v.valueType = Value::ValueType::INT;
312- v.bound = Value::Bound::Point;
309+ const Value::Bound bound = value.bound;
310+ const long long intvalue = value.intvalue;
311+ value.valueType = Value::ValueType::INT;
312+ value.bound = Value::Bound::Point;
313313 if (value.isImpossible()) {
314- if (value. intvalue == 0)
315- v .setKnown();
316- else if ((value. bound == Value::Bound::Upper && value. intvalue > 0) ||
317- (value. bound == Value::Bound::Lower && value. intvalue < 0)) {
318- v .intvalue = 0;
319- v .setKnown();
314+ if (intvalue == 0)
315+ value .setKnown();
316+ else if ((bound == Value::Bound::Upper && intvalue > 0) ||
317+ (bound == Value::Bound::Lower && intvalue < 0)) {
318+ value .intvalue = 0;
319+ value .setKnown();
320320 } else
321- v .setPossible();
321+ value .setPossible();
322322 } else {
323- v .intvalue = !v .intvalue;
323+ value .intvalue = !value .intvalue;
324324 }
325- setTokenValue(next, std::move(v ), settings);
325+ setTokenValue(next, std::move(value ), settings);
326326 }
327327 return;
328328 }
@@ -346,27 +346,26 @@ namespace ValueFlow
346346 setTokenValue(parent, std::move(value), settings);
347347 return;
348348 }
349- Value pvalue = value;
350349 if (!value.subexpressions.empty() && Token::Match(parent, ". %var%")) {
351350 if (contains(value.subexpressions, parent->strAt(1)))
352- pvalue .subexpressions.clear();
351+ value .subexpressions.clear();
353352 else
354353 return;
355354 }
356355 if (parent->isUnaryOp("&")) {
357- pvalue .indirect++;
358- setTokenValue(parent, std::move(pvalue ), settings);
356+ value .indirect++;
357+ setTokenValue(parent, std::move(value ), settings);
359358 } else if (Token::Match(parent, ". %var%") && parent->astOperand1() == tok && parent->astOperand2()) {
360- if (parent->originalName() == "->" && pvalue .indirect > 0)
361- pvalue .indirect--;
362- setTokenValue(parent->astOperand2(), std::move(pvalue ), settings);
359+ if (parent->originalName() == "->" && value .indirect > 0)
360+ value .indirect--;
361+ setTokenValue(parent->astOperand2(), std::move(value ), settings);
363362 } else if (Token::Match(parent->astParent(), ". %var%") && parent->astParent()->astOperand1() == parent) {
364- if (parent->astParent()->originalName() == "->" && pvalue .indirect > 0)
365- pvalue .indirect--;
366- setTokenValue(parent->astParent()->astOperand2(), std::move(pvalue ), settings);
367- } else if (parent->isUnaryOp("*") && pvalue .indirect > 0) {
368- pvalue .indirect--;
369- setTokenValue(parent, std::move(pvalue ), settings);
363+ if (parent->astParent()->originalName() == "->" && value .indirect > 0)
364+ value .indirect--;
365+ setTokenValue(parent->astParent()->astOperand2(), std::move(value ), settings);
366+ } else if (parent->isUnaryOp("*") && value .indirect > 0) {
367+ value .indirect--;
368+ setTokenValue(parent, std::move(value ), settings);
370369 }
371370 return;
372371 }
@@ -382,7 +381,7 @@ namespace ValueFlow
382381 && tok->valueType()->getSizeOf(settings, ValueType::Accuracy::ExactOrZero, ValueType::SizeOf::Pointer)
383382 >= valueType.getSizeOf(settings, ValueType::Accuracy::ExactOrZero, ValueType::SizeOf::Pointer))
384383 return;
385- setTokenValueCast(parent, valueType, value, settings);
384+ setTokenValueCast(parent, valueType, std::move( value) , settings);
386385 }
387386
388387 else if (parent->str() == ":") {
@@ -421,11 +420,10 @@ namespace ValueFlow
421420 if (ret)
422421 return;
423422
424- Value v(std::move(value));
425- v.conditional = true;
426- v.changeKnownToPossible();
423+ value.conditional = true;
424+ value.changeKnownToPossible();
427425
428- setTokenValue(parent, std::move(v ), settings);
426+ setTokenValue(parent, std::move(value ), settings);
429427 }
430428 }
431429
@@ -713,15 +711,13 @@ namespace ValueFlow
713711 std::vector<const Token*> args = getArguments(value.tokvalue);
714712 if (const Library::Function* f = settings.library.getFunction(parent->previous())) {
715713 if (f->containerYield == Library::Container::Yield::SIZE) {
716- Value v(std::move(value));
717- v.valueType = Value::ValueType::INT;
718- v.intvalue = args.size();
719- setTokenValue(parent, std::move(v), settings);
714+ value.valueType = Value::ValueType::INT;
715+ value.intvalue = args.size();
716+ setTokenValue(parent, std::move(value), settings);
720717 } else if (f->containerYield == Library::Container::Yield::EMPTY) {
721- Value v(std::move(value));
722- v.intvalue = args.empty();
723- v.valueType = Value::ValueType::INT;
724- setTokenValue(parent, std::move(v), settings);
718+ value.intvalue = args.empty();
719+ value.valueType = Value::ValueType::INT;
720+ setTokenValue(parent, std::move(value), settings);
725721 }
726722 }
727723 }
0 commit comments