Fixed #4119 (false positive with operator= when implemented in terms of swap)
This commit is contained in:
parent
a65f427195
commit
6d928a2ff7
|
@ -398,6 +398,12 @@ void CheckClass::initializeVarList(const Function &func, std::list<std::string>
|
|||
break;
|
||||
}
|
||||
|
||||
// Using swap to assign all variables..
|
||||
if (func.type == Function::eOperatorEqual && Token::Match(ftok, "[;{}] %var% (") && Token::Match(ftok->linkAt(2), ") . %var% ( *| this ) ;")) {
|
||||
assignAllVar(usage);
|
||||
break;
|
||||
}
|
||||
|
||||
// Calling member variable function?
|
||||
if (Token::Match(ftok->next(), "%var% . %var% (")) {
|
||||
std::list<Variable>::const_iterator var;
|
||||
|
|
|
@ -65,6 +65,7 @@ private:
|
|||
TEST_CASE(initvar_operator_eq2); // BUG 2190376
|
||||
TEST_CASE(initvar_operator_eq3);
|
||||
TEST_CASE(initvar_operator_eq4); // ticket #2204
|
||||
TEST_CASE(initvar_operator_eq5); // ticket #4119
|
||||
TEST_CASE(initvar_same_classname); // BUG 2208157
|
||||
TEST_CASE(initvar_chained_assign); // BUG 2270433
|
||||
TEST_CASE(initvar_2constructors); // BUG 2270353
|
||||
|
@ -422,6 +423,21 @@ private:
|
|||
ASSERT_EQUALS("", errout.str());
|
||||
}
|
||||
|
||||
void initvar_operator_eq5() { // #4119 - false positive when using swap to assign variables
|
||||
check("class Fred {\n"
|
||||
" int i;\n"
|
||||
"public:\n"
|
||||
" Fred() : i(5) { }\n"
|
||||
" ~Fred() { }\n"
|
||||
" Fred(const Fred &fred) : i(fred.i) { }\n"
|
||||
" Fred & operator=(const Fred &rhs) {\n"
|
||||
" Fred(rhs).swap(*this);\n"
|
||||
" return *this;\n"
|
||||
" }\n"
|
||||
"};\n");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
}
|
||||
|
||||
void initvar_same_classname() {
|
||||
// Bug 2208157 - False positive: Uninitialized variable, same class name
|
||||
|
||||
|
|
Loading…
Reference in New Issue