Skip to content

Commit a75872a

Browse files
Antti Tuppurainendanmar
authored andcommitted
Fix uniform init in out-of-class ctor-initer
1 parent 405a1fb commit a75872a

File tree

3 files changed

+44
-3
lines changed

3 files changed

+44
-3
lines changed

lib/tokenize.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2931,15 +2931,15 @@ void Tokenizer::setVarId()
29312931
}
29322932

29332933
// constructor with initializer list
2934-
if (Token::Match(tok2, ") : %name% (")) {
2934+
if (Token::Match(tok2, ") : %name% (|{")) {
29352935
Token *tok3 = tok2;
29362936
do {
29372937
Token *vartok = tok3->tokAt(2);
29382938
if (varlist[classname].find(vartok->str()) != varlist[classname].end())
29392939
vartok->varId(varlist[classname][vartok->str()]);
29402940
tok3 = tok3->linkAt(3);
2941-
} while (Token::Match(tok3, ") [:,] %name% ("));
2942-
if (Token::simpleMatch(tok3, ") {")) {
2941+
} while (Token::Match(tok3, ")|} [:,] %name% (|{"));
2942+
if (Token::Match(tok3, ")|} {")) {
29432943
setVarIdClassFunction(classname, tok2, tok3->next()->link(), varlist[classname], &structMembers, &_varId);
29442944
}
29452945
}

test/testclass.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6007,13 +6007,36 @@ class TestClass : public TestFixture {
60076007
"};");
60086008
ASSERT_EQUALS("[test.cpp:3]: (error) Member variable 's' is initialized by itself.\n", errout.str());
60096009

6010+
checkSelfInitialization("class Fred {\n"
6011+
" int x;\n"
6012+
" Fred(int x);\n"
6013+
"};\n"
6014+
"Fred::Fred(int x) : x(x) { }\n"
6015+
);
6016+
ASSERT_EQUALS("", errout.str());
6017+
6018+
checkSelfInitialization("class Fred {\n"
6019+
" int x;\n"
6020+
" Fred(int x);\n"
6021+
"};\n"
6022+
"Fred::Fred(int x) : x{x} { }\n"
6023+
);
6024+
ASSERT_EQUALS("", errout.str());
6025+
60106026
checkSelfInitialization("class Fred {\n"
60116027
" std::string s;\n"
60126028
" Fred(const std::string& s) : s(s) {\n"
60136029
" }\n"
60146030
"};");
60156031
ASSERT_EQUALS("", errout.str());
60166032

6033+
checkSelfInitialization("class Fred {\n"
6034+
" std::string s;\n"
6035+
" Fred(const std::string& s) : s{s} {\n"
6036+
" }\n"
6037+
"};");
6038+
ASSERT_EQUALS("", errout.str());
6039+
60176040
checkSelfInitialization("struct Foo : Bar {\n"
60186041
" int i;\n"
60196042
" Foo(int i)\n"

test/testvarid.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ class TestVarID : public TestFixture {
156156
TEST_CASE(varidclass15); // initializer list
157157
TEST_CASE(varidclass16); // #4577
158158
TEST_CASE(varidclass17); // #6073
159+
TEST_CASE(varidclass18);
159160
TEST_CASE(varid_classnameshaddowsvariablename); // #3990
160161

161162
TEST_CASE(varidnamespace1);
@@ -2541,6 +2542,23 @@ class TestVarID : public TestFixture {
25412542
ASSERT_EQUALS(expected, tokenize(code));
25422543
}
25432544

2545+
void varidclass18() {
2546+
const char code[] = "class A {\n"
2547+
" int a;\n"
2548+
" int b;\n"
2549+
" A();\n"
2550+
"};\n"
2551+
"A::A() : a{0} { b = 1; }";
2552+
const char expected[] = "\n\n##file 0\n"
2553+
"1: class A {\n"
2554+
"2: int a@1 ;\n"
2555+
"3: int b@2 ;\n"
2556+
"4: A ( ) ;\n"
2557+
"5: } ;\n"
2558+
"6: A :: A ( ) : a@1 { 0 } { b@2 = 1 ; }\n";
2559+
ASSERT_EQUALS(expected, tokenize(code));
2560+
}
2561+
25442562
void varid_classnameshaddowsvariablename() {
25452563
const char code[] = "class Data;\n"
25462564
"void strange_declarated(const Data& Data);\n"

0 commit comments

Comments
 (0)