@@ -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