@@ -2996,7 +2996,7 @@ struct ValueFlowAnalyzer : Analyzer {
29962996 return isThisModified (tok);
29972997
29982998 // bailout: global non-const variables
2999- if (isGlobal () && !dependsOnThis () && Token::Match (tok, " %name% (" ) &&
2999+ if (isGlobal () && !dependsOnThis () && Token::Match (tok, " %name% (" ) && !tok-> variable () &&
30003000 !Token::simpleMatch (tok->linkAt (1 ), " ) {" )) {
30013001 return isGlobalModified (tok);
30023002 }
@@ -5938,7 +5938,7 @@ static void valueFlowForwardAssign(Token* const tok,
59385938 }
59395939
59405940 // Static variable initialisation?
5941- if (vars.size () == 1 && vars.front ()->isStatic () && init)
5941+ if (vars.size () == 1 && vars.front ()->isStatic () && !vars. front ()-> isConst () && init)
59425942 lowerToPossible (values);
59435943
59445944 // is volatile
@@ -6057,13 +6057,25 @@ static std::list<ValueFlow::Value> truncateValues(std::list<ValueFlow::Value> va
60576057
60586058static bool isVariableInit (const Token *tok)
60596059{
6060- return (tok->str () == " (" || tok->str () == " {" ) &&
6061- (tok->isBinaryOp () || (tok->astOperand1 () && tok->link () == tok->next ())) &&
6062- tok->astOperand1 ()->variable () &&
6063- tok->astOperand1 ()->variable ()->nameToken () == tok->astOperand1 () &&
6064- tok->astOperand1 ()->variable ()->valueType () &&
6065- tok->astOperand1 ()->variable ()->valueType ()->type >= ValueType::Type::VOID &&
6066- !Token::simpleMatch (tok->astOperand2 (), " ," );
6060+ if (!tok)
6061+ return false ;
6062+ if (!Token::Match (tok->previous (), " %var% (|{" ))
6063+ return false ;
6064+ if (!tok->isBinaryOp () && !(tok->astOperand1 () && tok->link () == tok->next ()))
6065+ return false ;
6066+ if (Token::simpleMatch (tok->astOperand2 (), " ," ))
6067+ return false ;
6068+ const Variable* var = tok->astOperand1 ()->variable ();
6069+ if (!var)
6070+ return false ;
6071+ if (var->nameToken () != tok->astOperand1 ())
6072+ return false ;
6073+ const ValueType* vt = var->valueType ();
6074+ if (!vt)
6075+ return false ;
6076+ if (vt->type < ValueType::Type::VOID)
6077+ return false ;
6078+ return true ;
60676079}
60686080
60696081// Return true if two associative containers intersect
0 commit comments