Fix FP when using non-const members and also check return type of function (#1283)
This commit is contained in:
parent
d9f9bdda73
commit
8d53bcfd63
|
@ -433,8 +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);
|
||||||
for (const Function& f:scope->functionList) {
|
for (const Function& f:scope->functionList) {
|
||||||
if (f.argumentList.size() == fun->argumentList.size() && f.name() != fun->name()) {
|
std::string freturnType = f.retType ? f.retType->name() : f.retDef->stringifyList(f.tokenDef);
|
||||||
|
if (f.argumentList.size() == fun->argumentList.size() &&
|
||||||
|
f.type == Function::eFunction &&
|
||||||
|
returnType == freturnType &&
|
||||||
|
f.name() != fun->name()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1947,7 +1947,7 @@ void CheckOther::checkDuplicateExpression()
|
||||||
tok->next()->tokType() != Token::eType &&
|
tok->next()->tokType() != Token::eType &&
|
||||||
tok->next()->tokType() != Token::eName &&
|
tok->next()->tokType() != Token::eName &&
|
||||||
isSameExpression(_tokenizer->isCPP(), true, tok->next(), nextAssign->next(), _settings->library, true) &&
|
isSameExpression(_tokenizer->isCPP(), true, tok->next(), nextAssign->next(), _settings->library, true) &&
|
||||||
isSameExpression(_tokenizer->isCPP(), true, tok->astOperand2(), nextAssign->astOperand2(), _settings->library, false) &&
|
isSameExpression(_tokenizer->isCPP(), true, tok->astOperand2(), nextAssign->astOperand2(), _settings->library, true) &&
|
||||||
!isUniqueExpression(tok->astOperand2())) {
|
!isUniqueExpression(tok->astOperand2())) {
|
||||||
duplicateAssignExpressionError(var1, var2);
|
duplicateAssignExpressionError(var1, var2);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3980,11 +3980,12 @@ private:
|
||||||
|
|
||||||
void duplicateVarExpression() {
|
void duplicateVarExpression() {
|
||||||
check("int f() __attribute__((pure));\n"
|
check("int f() __attribute__((pure));\n"
|
||||||
|
"int g() __attribute__((pure));\n"
|
||||||
"void test() {\n"
|
"void test() {\n"
|
||||||
" int i = f();\n"
|
" int i = f();\n"
|
||||||
" int j = f();\n"
|
" int j = f();\n"
|
||||||
"}");
|
"}");
|
||||||
ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (style) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4]: (style) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout.str());
|
||||||
|
|
||||||
check("struct Foo { int f() const; int g() const; };\n"
|
check("struct Foo { int f() const; int g() const; };\n"
|
||||||
"void test() {\n"
|
"void test() {\n"
|
||||||
|
@ -4004,18 +4005,20 @@ private:
|
||||||
ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:5]: (style) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:5]: (style) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout.str());
|
||||||
|
|
||||||
check("int f() __attribute__((pure));\n"
|
check("int f() __attribute__((pure));\n"
|
||||||
|
"int g() __attribute__((pure));\n"
|
||||||
"void test() {\n"
|
"void test() {\n"
|
||||||
" int i = 1 + f();\n"
|
" int i = 1 + f();\n"
|
||||||
" int j = 1 + f();\n"
|
" int j = 1 + f();\n"
|
||||||
"}");
|
"}");
|
||||||
ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (style) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4]: (style) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout.str());
|
||||||
|
|
||||||
check("int f() __attribute__((pure));\n"
|
check("int f() __attribute__((pure));\n"
|
||||||
|
"int g() __attribute__((pure));\n"
|
||||||
"void test() {\n"
|
"void test() {\n"
|
||||||
" int i = f() + f();\n"
|
" int i = f() + f();\n"
|
||||||
" int j = f() + f();\n"
|
" int j = f() + f();\n"
|
||||||
"}");
|
"}");
|
||||||
ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (style) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4]: (style) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout.str());
|
||||||
|
|
||||||
check("int f(int) __attribute__((pure));\n"
|
check("int f(int) __attribute__((pure));\n"
|
||||||
"int g(int) __attribute__((pure));\n"
|
"int g(int) __attribute__((pure));\n"
|
||||||
|
@ -4058,6 +4061,7 @@ private:
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
check("int f();\n"
|
check("int f();\n"
|
||||||
|
"int g();\n"
|
||||||
"void test() {\n"
|
"void test() {\n"
|
||||||
" int i = f() || f();\n"
|
" int i = f() || f();\n"
|
||||||
" int j = f() && f();\n"
|
" int j = f() && f();\n"
|
||||||
|
@ -4078,6 +4082,22 @@ private:
|
||||||
"}");
|
"}");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("struct Foo { int f() const; float g() const; };\n"
|
||||||
|
"void test() {\n"
|
||||||
|
" Foo f = Foo{};\n"
|
||||||
|
" int i = f.f();\n"
|
||||||
|
" int j = f.f();\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("struct Foo { int f(); int g(); };\n"
|
||||||
|
"void test() {\n"
|
||||||
|
" Foo f = Foo{};\n"
|
||||||
|
" int i = f.f();\n"
|
||||||
|
" int j = f.f();\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
check("void test() {\n"
|
check("void test() {\n"
|
||||||
" int i = f();\n"
|
" int i = f();\n"
|
||||||
" int j = f();\n"
|
" int j = f();\n"
|
||||||
|
|
Loading…
Reference in New Issue