#6700 const vs non-const inside assert() statement. Function matching in symboldatabase did not honor const'ness of a class instance variable
This commit is contained in:
parent
f0bc300198
commit
e8d84bc6b4
|
@ -3101,7 +3101,7 @@ void Scope::findFunctionInBase(const std::string & name, size_t args, std::vecto
|
|||
This can be difficult because of promotion and conversion operators and casts
|
||||
and because the argument can also be a function call.
|
||||
*/
|
||||
const Function* Scope::findFunction(const Token *tok) const
|
||||
const Function* Scope::findFunction(const Token *tok, bool requireConst) const
|
||||
{
|
||||
// make sure this is a function call
|
||||
const Token *end = tok->linkAt(1);
|
||||
|
@ -3232,6 +3232,9 @@ const Function* Scope::findFunction(const Token *tok) const
|
|||
|
||||
// check if all arguments matched
|
||||
if (same == args) {
|
||||
if (requireConst && func->isConst())
|
||||
return func;
|
||||
|
||||
// get the function this call is in
|
||||
const Scope * scope = tok->scope();
|
||||
|
||||
|
@ -3320,7 +3323,7 @@ const Function* SymbolDatabase::findFunction(const Token *tok) const
|
|||
if (Token::Match(tok1, "%var% .")) {
|
||||
const Variable *var = getVariableFromVarId(tok1->varId());
|
||||
if (var && var->typeScope())
|
||||
return var->typeScope()->findFunction(tok);
|
||||
return var->typeScope()->findFunction(tok, var->isConst());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -842,9 +842,10 @@ public:
|
|||
/**
|
||||
* @brief find a function
|
||||
* @param tok token of function call
|
||||
* @param requireConst if const refers to a const variable only const methods should be matched
|
||||
* @return pointer to function if found or NULL if not found
|
||||
*/
|
||||
const Function *findFunction(const Token *tok) const;
|
||||
const Function *findFunction(const Token *tok, bool requireConst=false) const;
|
||||
|
||||
/**
|
||||
* @brief find if name is in nested list
|
||||
|
|
|
@ -240,6 +240,7 @@ private:
|
|||
TEST_CASE(findFunction4);
|
||||
TEST_CASE(findFunction5); // #6230
|
||||
TEST_CASE(findFunction6);
|
||||
TEST_CASE(findFunction7); // #6700
|
||||
|
||||
TEST_CASE(noexceptFunction1);
|
||||
TEST_CASE(noexceptFunction2);
|
||||
|
@ -2517,6 +2518,26 @@ private:
|
|||
ASSERT_EQUALS(true, db && f && !f->function()); // regression value only
|
||||
}
|
||||
|
||||
void findFunction7() {
|
||||
GET_SYMBOL_DB("class ResultEnsemble {\n"
|
||||
"public:\n"
|
||||
" std::vector<int> &nodeResults() const;\n"
|
||||
" std::vector<int> &nodeResults();\n"
|
||||
"};\n"
|
||||
"class Simulator {\n"
|
||||
" int generatePinchResultEnsemble(const ResultEnsemble &power, const ResultEnsemble &ground) {\n"
|
||||
" power.nodeResults().size();\n"
|
||||
" assert(power.nodeResults().size()==ground.nodeResults().size());\n"
|
||||
" }\n"
|
||||
"};")
|
||||
const Token *callfunc = Token::findsimplematch(tokenizer.tokens(), "power . nodeResults ( ) . size ( ) ;");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
ASSERT_EQUALS(true, db != nullptr); // not null
|
||||
ASSERT_EQUALS(true, callfunc != nullptr); // not null
|
||||
ASSERT_EQUALS(true, callfunc && callfunc->tokAt(2)->function() && callfunc->tokAt(2)->function()->tokenDef->linenr() == 3);
|
||||
}
|
||||
|
||||
|
||||
|
||||
#define FUNC(x) const Function *x = findFunctionByName(#x, &db->scopeList.front()); \
|
||||
ASSERT_EQUALS(true, x != nullptr); \
|
||||
|
|
Loading…
Reference in New Issue