Fix issue 9231: FP constParameter - argument passed parent ctor (#2032)
This commit is contained in:
parent
999d2f797c
commit
744a94ad5a
|
@ -1271,6 +1271,32 @@ static bool isUnusedVariable(const Variable *var)
|
||||||
return !Token::findmatch(start->next(), "%varid%", var->scope()->bodyEnd, var->declarationId());
|
return !Token::findmatch(start->next(), "%varid%", var->scope()->bodyEnd, var->declarationId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool isVariableMutableInInitializer(const Token* start, const Token * end, nonneg int varid)
|
||||||
|
{
|
||||||
|
if (!start)
|
||||||
|
return false;
|
||||||
|
if (!end)
|
||||||
|
return false;
|
||||||
|
for (const Token *tok = start; tok != end; tok = tok->next()) {
|
||||||
|
if (tok->varId() != varid)
|
||||||
|
continue;
|
||||||
|
if (tok->astParent()) {
|
||||||
|
const Token * memberTok = tok->astParent()->previous();
|
||||||
|
if (Token::Match(memberTok, "%var% (") && memberTok->variable()) {
|
||||||
|
const Variable * memberVar = memberTok->variable();
|
||||||
|
if (!memberVar->isReference())
|
||||||
|
continue;
|
||||||
|
if (memberVar->isConst())
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void CheckOther::checkConstVariable()
|
void CheckOther::checkConstVariable()
|
||||||
{
|
{
|
||||||
if (!mSettings->isEnabled(Settings::STYLE) || mTokenizer->isC())
|
if (!mSettings->isEnabled(Settings::STYLE) || mTokenizer->isC())
|
||||||
|
@ -1298,8 +1324,7 @@ void CheckOther::checkConstVariable()
|
||||||
continue;
|
continue;
|
||||||
if (isUnusedVariable(var))
|
if (isUnusedVariable(var))
|
||||||
continue;
|
continue;
|
||||||
const Token * memberTok = Token::findmatch(function->constructorMemberInitialization(), "%var% ( %varid% )", scope->bodyStart, var->declarationId());
|
if (function->isConstructor() && isVariableMutableInInitializer(function->constructorMemberInitialization(), scope->bodyStart, var->declarationId()))
|
||||||
if (memberTok && memberTok->variable() && memberTok->variable()->isReference())
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (var->isGlobal())
|
if (var->isGlobal())
|
||||||
|
|
|
@ -1892,6 +1892,15 @@ private:
|
||||||
"};\n");
|
"};\n");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("struct A {\n"
|
||||||
|
" A(int& x);\n"
|
||||||
|
"};\n"
|
||||||
|
"struct B : A {\n"
|
||||||
|
" B(int& x) : A(x)\n"
|
||||||
|
" {}\n"
|
||||||
|
"};\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
check("void e();\n"
|
check("void e();\n"
|
||||||
"void g(void);\n"
|
"void g(void);\n"
|
||||||
"void h(void);\n"
|
"void h(void);\n"
|
||||||
|
|
Loading…
Reference in New Issue