@@ -1411,27 +1411,31 @@ bool isCPPCast(const Token* tok)
14111411 return tok && Token::simpleMatch (tok->previous (), " > (" ) && tok->astOperand2 () && tok->astOperand1 () && tok->astOperand1 ()->str ().find (" _cast" ) != std::string::npos;
14121412}
14131413
1414- bool isConstVarExpression (const Token *tok)
1414+ bool isConstVarExpression (const Token *tok, const char * skipMatch )
14151415{
14161416 if (!tok)
14171417 return false ;
1418+ if (skipMatch && Token::Match (tok, skipMatch))
1419+ return false ;
14181420 if (Token::simpleMatch (tok->previous (), " sizeof (" ))
14191421 return true ;
14201422 if (Token::Match (tok->previous (), " %name% (" )) {
1423+ if (Token::simpleMatch (tok->astOperand1 (), " ." ) && !isConstVarExpression (tok->astOperand1 (), skipMatch))
1424+ return false ;
14211425 std::vector<const Token *> args = getArguments (tok);
1422- return std::all_of (args.begin (), args.end (), & isConstVarExpression);
1426+ return std::all_of (args.begin (), args.end (), [&]( const Token* t) { return isConstVarExpression (t, skipMatch); } );
14231427 }
14241428 if (isCPPCast (tok)) {
1425- return isConstVarExpression (tok->astOperand2 ());
1429+ return isConstVarExpression (tok->astOperand2 (), skipMatch );
14261430 }
14271431 if (Token::Match (tok, " ( %type%" ))
1428- return isConstVarExpression (tok->astOperand1 ());
1432+ return isConstVarExpression (tok->astOperand1 (), skipMatch );
14291433 if (tok->str () == " ::" && tok->hasKnownValue ())
1430- return isConstVarExpression (tok->astOperand2 ());
1434+ return isConstVarExpression (tok->astOperand2 (), skipMatch );
14311435 if (Token::Match (tok, " %cop%|[|." )) {
1432- if (tok->astOperand1 () && !isConstVarExpression (tok->astOperand1 ()))
1436+ if (tok->astOperand1 () && !isConstVarExpression (tok->astOperand1 (), skipMatch ))
14331437 return false ;
1434- if (tok->astOperand2 () && !isConstVarExpression (tok->astOperand2 ()))
1438+ if (tok->astOperand2 () && !isConstVarExpression (tok->astOperand2 (), skipMatch ))
14351439 return false ;
14361440 return true ;
14371441 }
@@ -1440,7 +1444,7 @@ bool isConstVarExpression(const Token *tok)
14401444 if (tok->isEnumerator ())
14411445 return true ;
14421446 if (tok->variable ())
1443- return tok->variable ()->isConst ();
1447+ return tok->variable ()->isConst () && tok-> variable ()-> nameToken () && tok-> variable ()-> nameToken ()-> hasKnownValue () ;
14441448 return false ;
14451449}
14461450
0 commit comments