Skip to content

Commit efef484

Browse files
authored
Fix #13559: Tokenizer: remove simplification that converts 'int x(0)' to 'int x; x = 0;' (danmar#7252)
1 parent fb8bd0e commit efef484

File tree

6 files changed

+59
-57
lines changed

6 files changed

+59
-57
lines changed

lib/token.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -725,6 +725,13 @@ class CPPCHECKLIB Token {
725725
setFlag(fIsInitComma, b);
726726
}
727727

728+
bool isInitBracket() const {
729+
return getFlag(fIsInitBracket);
730+
}
731+
void isInitBracket(bool b) {
732+
setFlag(fIsInitBracket, b);
733+
}
734+
728735
// cppcheck-suppress unusedFunction
729736
bool isBitfield() const {
730737
return mImpl->mBits > 0;
@@ -1401,6 +1408,7 @@ class CPPCHECKLIB Token {
14011408
fIsSimplifiedTypedef = (1ULL << 40),
14021409
fIsFinalType = (1ULL << 41), // Is this a type with final specifier
14031410
fIsInitComma = (1ULL << 42), // Is this comma located inside some {..}. i.e: {1,2,3,4}
1411+
fIsInitBracket = (1ULL << 43), // Is this bracket used as a part of variable initialization i.e: int a{5}, b(2);
14041412
};
14051413

14061414
enum : std::uint8_t {

lib/tokenize.cpp

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6091,6 +6091,8 @@ void Tokenizer::dump(std::ostream &out) const
60916091
outs += " isAttributeMaybeUnused=\"true\"";
60926092
if (tok->isAttributeUnused())
60936093
outs += " isAttributeUnused=\"true\"";
6094+
if (tok->isInitBracket())
6095+
outs += " isInitBracket=\"true\"";
60946096
if (tok->hasAttributeAlignas()) {
60956097
const std::vector<std::string>& a = tok->getAttributeAlignas();
60966098
outs += " alignas=\"" + ErrorLogger::toxml(a[0]) + "\"";
@@ -7706,23 +7708,27 @@ void Tokenizer::simplifyInitVar()
77067708
if (tok->str() == "return")
77077709
continue;
77087710

7709-
if (Token::Match(tok, "class|struct|union| %type% *| %name% (|{ &| %any% )|} ;")) {
7710-
tok = initVar(tok);
7711-
} else if (Token::Match(tok, "%type% *| %name% ( %type% (")) {
7712-
const Token* tok2 = tok->tokAt(2);
7713-
if (!tok2->link())
7711+
if (Token::Match(tok, "%type% *|&| %name% (|{")) {
7712+
while (tok && !Token::Match(tok, "(|{"))
7713+
tok = tok->next();
7714+
if (tok)
7715+
tok->isInitBracket(true);
7716+
/* tok = initVar(tok);
7717+
} else if (Token::Match(tok, "%type% *| %name% ( %type% (")) {
7718+
const Token* tok2 = tok->tokAt(2);
7719+
if (!tok2->link())
77147720
tok2 = tok2->next();
7715-
if (!tok2->link() || (tok2->link()->strAt(1) == ";" && !Token::simpleMatch(tok2->linkAt(2), ") (")))
7721+
if (!tok2->link() || (tok2->link()->strAt(1) == ";" && !Token::simpleMatch(tok2->linkAt(2), ") (")))
77167722
tok = initVar(tok);
7717-
} else if (Token::Match(tok, "class|struct|union| %type% *| %name% ( &| %any% ) ,") && tok->str() != "new") {
7718-
Token *tok1 = tok->tokAt(5);
7719-
while (tok1->str() != ",")
7723+
} else if (Token::Match(tok, "class|struct|union| %type% *| %name% ( &| %any% ) ,") && tok->str() != "new") {
7724+
Token *tok1 = tok->tokAt(5);
7725+
while (tok1->str() != ",")
77207726
tok1 = tok1->next();
7721-
tok1->str(";");
7727+
tok1->str(";");
77227728
7723-
const int numTokens = (Token::Match(tok, "class|struct|union")) ? 2 : 1;
7724-
TokenList::insertTokens(tok1, tok, numTokens);
7725-
tok = initVar(tok);
7729+
const int numTokens = (Token::Match(tok, "class|struct|union")) ? 2 : 1;
7730+
TokenList::insertTokens(tok1, tok, numTokens);
7731+
tok = initVar(tok); */
77267732
}
77277733
}
77287734
}

test/testsimplifytokens.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1041,7 +1041,7 @@ class TestSimplifyTokens : public TestFixture {
10411041
// ticket #980
10421042
{
10431043
const char code[] = "void f() { int A(1),B(2),C=3,D,E(5),F=6; }";
1044-
const char expected[] = "void f ( ) { int A ; A = 1 ; int B ; B = 2 ; int C ; C = 3 ; int D ; int E ; E = 5 ; int F ; F = 6 ; }";
1044+
const char expected[] = "void f ( ) { int A ( 1 ) ; int B ( 2 ) ; int C ; C = 3 ; int D ; int E ( 5 ) ; int F ; F = 6 ; }";
10451045
ASSERT_EQUALS(expected, tok(code));
10461046
}
10471047

@@ -2540,10 +2540,10 @@ class TestSimplifyTokens : public TestFixture {
25402540
"3: namespace M { const int m@2 = 0 ; }\n"
25412541
"4: }\n"
25422542
"5: using namespace N ;\n"
2543-
"6: int i ; i = n@1 ;\n"
2543+
"6: int i ( n@1 ) ;\n"
25442544
"7: int j ( M :: m@2 ) ;\n"
25452545
"8: using namespace N :: M ;\n"
2546-
"9: int k ; k = m@2 ;\n"
2546+
"9: int k ( m@2 ) ;\n"
25472547
"10: int l ( N :: M :: m@2 ) ;\n";
25482548
ASSERT_EQUALS(exp, tokenizeDebugListing(code));
25492549
}

test/testtokenize.cpp

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -587,7 +587,7 @@ class TestTokenizer : public TestFixture {
587587
" int x1 = 1;\n"
588588
" int x2(x1);\n"
589589
"}\n";
590-
ASSERT_EQUALS("void f ( ) {\nint x1 ; x1 = 1 ;\nint x2 ; x2 = x1 ;\n}",
590+
ASSERT_EQUALS("void f ( ) {\nint x1 ; x1 = 1 ;\nint x2 ( x1 ) ;\n}",
591591
tokenizeAndStringify(code));
592592
}
593593

@@ -597,8 +597,8 @@ class TestTokenizer : public TestFixture {
597597
" int x2(x1);\n"
598598
"}\n";
599599
ASSERT_EQUALS("1: void f ( ) {\n"
600-
"2: int x1@1 ; x1@1 = g ( ) ;\n"
601-
"3: int x2@2 ; x2@2 = x1@1 ;\n"
600+
"2: int x1@1 ( g ( ) ) ;\n"
601+
"3: int x2@2 ( x1@1 ) ;\n"
602602
"4: }\n",
603603
tokenizeDebugListing(code));
604604
}
@@ -4294,79 +4294,79 @@ class TestTokenizer : public TestFixture {
42944294
void simplifyInitVar() {
42954295
{
42964296
const char code[] = "int i ; int p(0);";
4297-
ASSERT_EQUALS("int i ; int p ; p = 0 ;", tokenizeAndStringify(code));
4297+
ASSERT_EQUALS("int i ; int p ( 0 ) ;", tokenizeAndStringify(code));
42984298
ASSERT_EQUALS("", errout_str());
42994299
}
43004300

43014301
{
43024302
const char code[] = "int i; int *p(0);";
4303-
ASSERT_EQUALS("int i ; int * p ; p = 0 ;", tokenizeAndStringify(code));
4303+
ASSERT_EQUALS("int i ; int * p ( 0 ) ;", tokenizeAndStringify(code));
43044304
ASSERT_EQUALS("", errout_str());
43054305
}
43064306

43074307
{
43084308
const char code[] = "int p(0);";
4309-
ASSERT_EQUALS("int p ; p = 0 ;", tokenizeAndStringify(code));
4309+
ASSERT_EQUALS("int p ( 0 ) ;", tokenizeAndStringify(code));
43104310
ASSERT_EQUALS("", errout_str());
43114311
}
43124312

43134313
{
43144314
const char code[] = "int *p(0);";
4315-
ASSERT_EQUALS("int * p ; p = 0 ;", tokenizeAndStringify(code));
4315+
ASSERT_EQUALS("int * p ( 0 ) ;", tokenizeAndStringify(code));
43164316
ASSERT_EQUALS("", errout_str());
43174317
}
43184318

43194319
{
43204320
const char code[] = "int i ; int p(i);";
4321-
ASSERT_EQUALS("int i ; int p ; p = i ;", tokenizeAndStringify(code));
4321+
ASSERT_EQUALS("int i ; int p ( i ) ;", tokenizeAndStringify(code));
43224322
ASSERT_EQUALS("", errout_str());
43234323
}
43244324

43254325
{
43264326
const char code[] = "int i; int *p(&i);";
4327-
ASSERT_EQUALS("int i ; int * p ; p = & i ;", tokenizeAndStringify(code));
4327+
ASSERT_EQUALS("int i ; int * p ( & i ) ;", tokenizeAndStringify(code));
43284328
ASSERT_EQUALS("", errout_str());
43294329
}
43304330

43314331
{
43324332
const char code[] = "int i; void *p(&i);";
4333-
ASSERT_EQUALS("int i ; void * p ; p = & i ;", tokenizeAndStringify(code));
4333+
ASSERT_EQUALS("int i ; void * p ( & i ) ;", tokenizeAndStringify(code));
43344334
ASSERT_EQUALS("", errout_str());
43354335
}
43364336

43374337
{
43384338
const char code[] = "struct S { }; struct S s; struct S *p(&s);";
4339-
ASSERT_EQUALS("struct S { } ; struct S s ; struct S * p ; p = & s ;", tokenizeAndStringify(code));
4339+
ASSERT_EQUALS("struct S { } ; struct S s ; struct S * p ( & s ) ;", tokenizeAndStringify(code));
43404340
ASSERT_EQUALS("", errout_str());
43414341
}
43424342

43434343
{
43444344
const char code[] = "struct S { }; S s; S *p(&s);";
4345-
ASSERT_EQUALS("struct S { } ; S s ; S * p ; p = & s ;", tokenizeAndStringify(code));
4345+
ASSERT_EQUALS("struct S { } ; S s ; S * p ( & s ) ;", tokenizeAndStringify(code));
43464346
ASSERT_EQUALS("", errout_str());
43474347
}
43484348

43494349
{
43504350
const char code[] = "union S { int i; float f; }; union S s; union S *p(&s);";
4351-
ASSERT_EQUALS("union S { int i ; float f ; } ; union S s ; union S * p ; p = & s ;", tokenizeAndStringify(code));
4351+
ASSERT_EQUALS("union S { int i ; float f ; } ; union S s ; union S * p ( & s ) ;", tokenizeAndStringify(code));
43524352
ASSERT_EQUALS("", errout_str());
43534353
}
43544354

43554355
{
43564356
const char code[] = "union S { int i; float f; }; S s; S *p(&s);";
4357-
ASSERT_EQUALS("union S { int i ; float f ; } ; S s ; S * p ; p = & s ;", tokenizeAndStringify(code));
4357+
ASSERT_EQUALS("union S { int i ; float f ; } ; S s ; S * p ( & s ) ;", tokenizeAndStringify(code));
43584358
ASSERT_EQUALS("", errout_str());
43594359
}
43604360

43614361
{
43624362
const char code[] = "class C { }; class C c; class C *p(&c);";
4363-
ASSERT_EQUALS("class C { } ; class C c ; class C * p ; p = & c ;", tokenizeAndStringify(code));
4363+
ASSERT_EQUALS("class C { } ; class C c ; class C * p ( & c ) ;", tokenizeAndStringify(code));
43644364
ASSERT_EQUALS("", errout_str());
43654365
}
43664366

43674367
{
43684368
const char code[] = "class C { }; C c; C *p(&c);";
4369-
ASSERT_EQUALS("class C { } ; C c ; C * p ; p = & c ;", tokenizeAndStringify(code));
4369+
ASSERT_EQUALS("class C { } ; C c ; C * p ( & c ) ;", tokenizeAndStringify(code));
43704370
ASSERT_EQUALS("", errout_str());
43714371
}
43724372

@@ -4458,13 +4458,13 @@ class TestTokenizer : public TestFixture {
44584458

44594459
{
44604460
const char code[] = "class A { } ; A a; int foo(a);";
4461-
ASSERT_EQUALS("class A { } ; A a ; int foo ; foo = a ;", tokenizeAndStringify(code));
4461+
ASSERT_EQUALS("class A { } ; A a ; int foo ( a ) ;", tokenizeAndStringify(code));
44624462
ASSERT_EQUALS("", errout_str());
44634463
}
44644464

44654465
{
44664466
const char code[] = "int x(f());";
4467-
ASSERT_EQUALS("int x ; x = f ( ) ;", tokenizeAndStringify(code));
4467+
ASSERT_EQUALS("int x ( f ( ) ) ;", tokenizeAndStringify(code));
44684468
ASSERT_EQUALS("", errout_str());
44694469
}
44704470

@@ -4481,7 +4481,7 @@ class TestTokenizer : public TestFixture {
44814481
" unsigned int a(0),b(0);\n"
44824482
"}";
44834483
ASSERT_EQUALS("void f ( ) {\n"
4484-
"unsigned int a ; a = 0 ; unsigned int b ; b = 0 ;\n"
4484+
"unsigned int a ( 0 ) ; unsigned int b ( 0 ) ;\n"
44854485
"}", tokenizeAndStringify(code));
44864486
}
44874487

@@ -4490,7 +4490,7 @@ class TestTokenizer : public TestFixture {
44904490
" int *a(0),b(0);\n"
44914491
"}";
44924492
ASSERT_EQUALS("void f ( ) {\n"
4493-
"int * a ; a = 0 ; int b ; b = 0 ;\n"
4493+
"int * a ( 0 ) ; int b ( 0 ) ;\n"
44944494
"}", tokenizeAndStringify(code));
44954495
}
44964496

@@ -4499,7 +4499,7 @@ class TestTokenizer : public TestFixture {
44994499
" uint32_t x{0};\n"
45004500
"}";
45014501
ASSERT_EQUALS("void f ( ) {\n"
4502-
"uint32_t x ; x = 0 ;\n"
4502+
"uint32_t x { 0 } ;\n"
45034503
"}", tokenizeAndStringify(code));
45044504
}
45054505

test/testunusedvar.cpp

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2096,10 +2096,7 @@ class TestUnusedVar : public TestFixture {
20962096
"{\n"
20972097
" int i(0);\n"
20982098
"}");
2099-
ASSERT_EQUALS(
2100-
"[test.cpp:3]: (style) Variable 'i' is assigned a value that is never used.\n"
2101-
"[test.cpp:3]: (style) Variable 'i' is assigned a value that is never used.\n", // duplicate
2102-
errout_str());
2099+
ASSERT_EQUALS("[test.cpp:3]: (style) Variable 'i' is assigned a value that is never used.\n", errout_str());
21032100

21042101
// if a is undefined then Cppcheck can't determine if "int i(a)" is a
21052102
// * variable declaration
@@ -2115,10 +2112,7 @@ class TestUnusedVar : public TestFixture {
21152112
" int j = 0;\n"
21162113
" int i(j);\n"
21172114
"}");
2118-
ASSERT_EQUALS(
2119-
"[test.cpp:4]: (style) Variable 'i' is assigned a value that is never used.\n"
2120-
"[test.cpp:4]: (style) Variable 'i' is assigned a value that is never used.\n", // duplicate
2121-
errout_str());
2115+
ASSERT_EQUALS("[test.cpp:4]: (style) Variable 'i' is assigned a value that is never used.\n", errout_str());
21222116

21232117
functionVariableUsage("void foo()\n"
21242118
"{\n"
@@ -2157,10 +2151,7 @@ class TestUnusedVar : public TestFixture {
21572151
" int * j = Data;\n"
21582152
" int * i(j);\n"
21592153
"}");
2160-
ASSERT_EQUALS(
2161-
"[test.cpp:4]: (style) Variable 'i' is assigned a value that is never used.\n"
2162-
"[test.cpp:4]: (style) Variable 'i' is assigned a value that is never used.\n", // duplicate
2163-
errout_str());
2154+
ASSERT_EQUALS("[test.cpp:4]: (style) Variable 'i' is assigned a value that is never used.\n", errout_str());
21642155

21652156
functionVariableUsage("void foo()\n"
21662157
"{\n"
@@ -6863,10 +6854,7 @@ class TestUnusedVar : public TestFixture {
68636854
functionVariableUsage("void f(int* p) {\n"
68646855
" int* q{ p };\n"
68656856
"}\n");
6866-
ASSERT_EQUALS(
6867-
"[test.cpp:2]: (style) Variable 'q' is assigned a value that is never used.\n"
6868-
"[test.cpp:2]: (style) Variable 'q' is assigned a value that is never used.\n", // duplicate
6869-
errout_str());
6857+
ASSERT_EQUALS("[test.cpp:2]: (style) Variable 'q' is assigned a value that is never used.\n", errout_str());
68706858
}
68716859

68726860
void localvarRangeBasedFor() {

test/testvarid.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2925,11 +2925,11 @@ class TestVarID : public TestFixture {
29252925
}
29262926

29272927
void varid_cpp11initialization() {
2928-
ASSERT_EQUALS("1: int i@1 ; i@1 = 1 ;\n"
2928+
ASSERT_EQUALS("1: int i@1 { 1 } ;\n"
29292929
"2: std :: vector < int > vec@2 { 1 , 2 , 3 } ;\n"
29302930
"3: namespace n { int z@3 ; } ;\n"
29312931
"4: int & j@4 { i@1 } ;\n"
2932-
"5: int k@5 ; k@5 = 1 ; int l@6 ; l@6 = 2 ;\n",
2932+
"5: int k@5 { 1 } ; int l@6 { 2 } ;\n",
29332933
tokenize("int i{1};\n"
29342934
"std::vector<int> vec{1, 2, 3};\n"
29352935
"namespace n { int z; };\n"
@@ -2948,7 +2948,7 @@ class TestVarID : public TestFixture {
29482948
ASSERT_EQUALS("1: class A : public B , public C :: D , public E < F > :: G < H > {\n"
29492949
"2: int i@1 ;\n"
29502950
"3: A ( int i@2 ) : B { i@2 } , C :: D { i@2 } , E < F > :: G < H > { i@2 } , i@1 { i@2 } {\n"
2951-
"4: int j@3 ; j@3 = i@2 ;\n"
2951+
"4: int j@3 { i@2 } ;\n"
29522952
"5: }\n"
29532953
"6: } ;\n",
29542954
tokenize("class A: public B, public C::D, public E<F>::G<H> {\n"
@@ -3819,7 +3819,7 @@ class TestVarID : public TestFixture {
38193819
const char expected[] = "1: class A : public B , public C :: D {\n"
38203820
"2: int i@1 ;\n"
38213821
"3: A ( int i@2 ) : B ( i@2 ) , C :: D ( i@2 ) , i@1 ( i@2 ) {\n"
3822-
"4: int j@3 ; j@3 = i@2 ;\n"
3822+
"4: int j@3 ( i@2 ) ;\n"
38233823
"5: }\n"
38243824
"6: } ;\n";
38253825
ASSERT_EQUALS(expected, tokenize(code));

0 commit comments

Comments
 (0)