Skip to content

Commit db342ea

Browse files
committed
Handle alias variables in CheckClass::initializeVarList() (danmar#6921)
1 parent aca8a69 commit db342ea

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed

lib/checkclass.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -730,6 +730,14 @@ void CheckClass::initializeVarList(const Function &func, std::list<const Functio
730730
// Assignment of member variable?
731731
else if (Token::Match(ftok, "%name% =")) {
732732
assignVar(ftok->str(), scope, usage);
733+
bool bailout = ftok->variable() && ftok->variable()->isReference();
734+
const Token* tok2 = ftok->tokAt(2);
735+
if (tok2->str() == "&") {
736+
tok2 = tok2->next();
737+
bailout = true;
738+
}
739+
if (tok2->variable() && (bailout || tok2->variable()->isArray()) && tok2->strAt(1) != "[")
740+
assignVar(tok2->str(), scope, usage);
733741
}
734742

735743
// Assignment of array item of member variable?

test/testconstructors.cpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ class TestConstructors : public TestFixture {
104104
TEST_CASE(initvar_destructor); // No variables need to be initialized in a destructor
105105
TEST_CASE(initvar_func_ret_func_ptr); // ticket #4449
106106

107+
TEST_CASE(initvar_alias); // #6921
108+
107109
TEST_CASE(operatorEqSTL);
108110

109111
TEST_CASE(uninitVar1);
@@ -1389,6 +1391,54 @@ class TestConstructors : public TestFixture {
13891391
ASSERT_EQUALS("", errout.str());
13901392
}
13911393

1394+
void initvar_alias() { // #6921
1395+
check("struct S {\n"
1396+
" int a;\n"
1397+
" S() {\n"
1398+
" int& pa = a;\n"
1399+
" pa = 4;\n"
1400+
" }\n"
1401+
"};");
1402+
ASSERT_EQUALS("", errout.str());
1403+
1404+
check("struct S {\n"
1405+
" int a;\n"
1406+
" S() {\n"
1407+
" int* pa = &a;\n"
1408+
" *pa = 4;\n"
1409+
" }\n"
1410+
"};");
1411+
ASSERT_EQUALS("", errout.str());
1412+
1413+
check("struct S {\n"
1414+
" int a[2];\n"
1415+
" S() {\n"
1416+
" int* pa = a;\n"
1417+
" for (int i = 0; i < 2; i++)\n"
1418+
" *pa++ = i;\n"
1419+
" }\n"
1420+
"};");
1421+
ASSERT_EQUALS("", errout.str());
1422+
1423+
check("struct S {\n"
1424+
" int* a[2];\n"
1425+
" S() {\n"
1426+
" int* pa = a[1];\n"
1427+
" *pa = 0;\n"
1428+
" }\n"
1429+
"};");
1430+
ASSERT_EQUALS("[test.cpp:3]: (warning) Member variable 'S::a' is not initialized in the constructor.\n", errout.str());
1431+
1432+
check("struct S {\n"
1433+
" int a;\n"
1434+
" S() {\n"
1435+
" int pa = a;\n"
1436+
" pa = 4;\n"
1437+
" }\n"
1438+
"};");
1439+
ASSERT_EQUALS("[test.cpp:3]: (warning) Member variable 'S::a' is not initialized in the constructor.\n", errout.str());
1440+
}
1441+
13921442
void operatorEqSTL() {
13931443
check("class Fred\n"
13941444
"{\n"

0 commit comments

Comments
 (0)