@@ -220,7 +220,8 @@ namespace ValueFlow
220220 void setTokenValue (Token* tok,
221221 Value value,
222222 const Settings& settings,
223- SourceLocation loc)
223+ SourceLocation loc,
224+ bool recurseNamespaces)
224225 {
225226 // Skip setting values that are too big since its ambiguous
226227 if (!value.isImpossible () && value.isIntValue () && value.intvalue < 0 && astIsUnsigned (tok)
@@ -237,6 +238,14 @@ namespace ValueFlow
237238 if (!tok->addValue (value))
238239 return ;
239240
241+ if (Token::simpleMatch (tok, " ::" ) && recurseNamespaces) {
242+ Token *inner = tok;
243+ while (Token::simpleMatch (inner, " ::" ))
244+ inner = inner->astOperand2 ();
245+ if (inner)
246+ setTokenValue (inner, value, settings, SourceLocation::current (), false );
247+ }
248+
240249 if (value.path < 0 )
241250 return ;
242251
@@ -701,8 +710,8 @@ namespace ValueFlow
701710 }
702711 }
703712
704- else if (Token::Match (parent, " :: %name%" ) && parent->astOperand2 () == tok) {
705- setTokenValue (parent, std::move (value), settings);
713+ else if (Token::Match (parent, " :: %name%" ) && parent->astOperand2 () == tok && recurseNamespaces ) {
714+ setTokenValue (parent, std::move (value), settings, SourceLocation::current (), false );
706715 }
707716
708717 // Calling std::size or std::empty on an array
0 commit comments