Fix FP virtualCallInConstructor with function pointer (#3913)
This commit is contained in:
parent
9d524616b3
commit
2baf8f6cd4
|
@ -2561,7 +2561,8 @@ const std::list<const Token *> & CheckClass::getVirtualFunctionCalls(const Funct
|
||||||
const Function * callFunction = tok->function();
|
const Function * callFunction = tok->function();
|
||||||
if (!callFunction ||
|
if (!callFunction ||
|
||||||
function.nestedIn != callFunction->nestedIn ||
|
function.nestedIn != callFunction->nestedIn ||
|
||||||
(tok->previous() && tok->previous()->str() == "."))
|
Token::simpleMatch(tok->previous(), ".") ||
|
||||||
|
!(tok->astParent() && (tok->astParent()->str() == "(" || (tok->astParent()->str() == "::" && Token::simpleMatch(tok->astParent()->astParent(), "(")))))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (tok->previous() &&
|
if (tok->previous() &&
|
||||||
|
|
|
@ -7286,6 +7286,24 @@ private:
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:13] -> [test.cpp:9]: (style) Virtual function 'Copy' is called from copy constructor 'Derived(const Derived&Src)' at line 13. Dynamic binding is not used.\n",
|
ASSERT_EQUALS("[test.cpp:13] -> [test.cpp:9]: (style) Virtual function 'Copy' is called from copy constructor 'Derived(const Derived&Src)' at line 13. Dynamic binding is not used.\n",
|
||||||
errout.str());
|
errout.str());
|
||||||
|
|
||||||
|
checkVirtualFunctionCall("struct B {\n"
|
||||||
|
" B() { auto pf = &f; }\n"
|
||||||
|
" virtual void f() {}\n"
|
||||||
|
"};\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
checkVirtualFunctionCall("struct B {\n"
|
||||||
|
" B() { auto pf = &B::f; }\n"
|
||||||
|
" virtual void f() {}\n"
|
||||||
|
"};\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
checkVirtualFunctionCall("struct B {\n"
|
||||||
|
" B() { (f)(); }\n"
|
||||||
|
" virtual void f() {}\n"
|
||||||
|
"};\n");
|
||||||
|
ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Virtual function 'f' is called from constructor 'B()' at line 2. Dynamic binding is not used.\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void pureVirtualFunctionCall() {
|
void pureVirtualFunctionCall() {
|
||||||
|
@ -7308,6 +7326,17 @@ private:
|
||||||
"{}");
|
"{}");
|
||||||
ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:3]: (warning) Call of pure virtual function 'pure' in constructor.\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:3]: (warning) Call of pure virtual function 'pure' in constructor.\n", errout.str());
|
||||||
|
|
||||||
|
checkVirtualFunctionCall("namespace N {\n"
|
||||||
|
" class A\n"
|
||||||
|
" {\n"
|
||||||
|
" virtual int pure() = 0;\n"
|
||||||
|
" A();\n"
|
||||||
|
" int m;\n"
|
||||||
|
" };\n"
|
||||||
|
"}\n"
|
||||||
|
"N::A::A() : m(N::A::pure()) {}\n");
|
||||||
|
ASSERT_EQUALS("[test.cpp:9] -> [test.cpp:4]: (warning) Call of pure virtual function 'pure' in constructor.\n", errout.str());
|
||||||
|
|
||||||
checkVirtualFunctionCall("class A\n"
|
checkVirtualFunctionCall("class A\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" virtual void pure()=0;\n"
|
" virtual void pure()=0;\n"
|
||||||
|
|
Loading…
Reference in New Issue