Fixed #8624 (Crash below CheckOther::checkDuplicateExpression)
This commit is contained in:
parent
c30f21ed2a
commit
593f7eee38
|
@ -433,11 +433,13 @@ bool isUniqueExpression(const Token* tok)
|
||||||
const Scope * scope = fun->nestedIn;
|
const Scope * scope = fun->nestedIn;
|
||||||
if (!scope)
|
if (!scope)
|
||||||
return true;
|
return true;
|
||||||
std::string returnType = fun->retType ? fun->retType->name() : fun->retDef->stringifyList(fun->tokenDef);
|
const std::string returnType = fun->retType ? fun->retType->name() : fun->retDef->stringifyList(fun->tokenDef);
|
||||||
for (const Function& f:scope->functionList) {
|
for (const Function& f:scope->functionList) {
|
||||||
std::string freturnType = f.retType ? f.retType->name() : f.retDef->stringifyList(f.tokenDef);
|
if (f.type != Function::eFunction)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
const std::string freturnType = f.retType ? f.retType->name() : f.retDef->stringifyList(f.tokenDef);
|
||||||
if (f.argumentList.size() == fun->argumentList.size() &&
|
if (f.argumentList.size() == fun->argumentList.size() &&
|
||||||
f.type == Function::eFunction &&
|
|
||||||
returnType == freturnType &&
|
returnType == freturnType &&
|
||||||
f.name() != fun->name()) {
|
f.name() != fun->name()) {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -135,6 +135,7 @@ private:
|
||||||
TEST_CASE(duplicateVarExpression);
|
TEST_CASE(duplicateVarExpression);
|
||||||
TEST_CASE(duplicateVarExpressionUnique);
|
TEST_CASE(duplicateVarExpressionUnique);
|
||||||
TEST_CASE(duplicateVarExpressionAssign);
|
TEST_CASE(duplicateVarExpressionAssign);
|
||||||
|
TEST_CASE(duplicateVarExpressionCrash);
|
||||||
|
|
||||||
TEST_CASE(checkSignOfUnsignedVariable);
|
TEST_CASE(checkSignOfUnsignedVariable);
|
||||||
TEST_CASE(checkSignOfPointer);
|
TEST_CASE(checkSignOfPointer);
|
||||||
|
@ -4225,6 +4226,22 @@ private:
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void duplicateVarExpressionCrash() {
|
||||||
|
// Issue #8624
|
||||||
|
check("struct X {\n"
|
||||||
|
" X();\n"
|
||||||
|
" int f() const;\n"
|
||||||
|
"};\n"
|
||||||
|
"void run() {\n"
|
||||||
|
" X x;\n"
|
||||||
|
" int a = x.f();\n"
|
||||||
|
" int b = x.f();\n"
|
||||||
|
" (void)a;\n"
|
||||||
|
" (void)b;\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
void checkSignOfUnsignedVariable() {
|
void checkSignOfUnsignedVariable() {
|
||||||
check(
|
check(
|
||||||
"void foo() {\n"
|
"void foo() {\n"
|
||||||
|
|
Loading…
Reference in New Issue