diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index c69e73d03be..e8ce5fa26a6 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -7631,16 +7631,20 @@ void Tokenizer::simplifyStaticConst() } // Move the qualifier to the left-most position in the declaration + const int column = tok->next()->column(); tok->deleteNext(); if (!leftTok) { list.front()->insertToken(qualifiers[i]); list.front()->swapWithNext(); + list.front()->column(column); tok = list.front(); } else if (leftTok->next()) { leftTok->next()->insertTokenBefore(qualifiers[i]); + leftTok->next()->column(column); tok = leftTok->next(); } else { leftTok->insertToken(qualifiers[i]); + leftTok->next()->column(column); tok = leftTok; } } @@ -9222,15 +9226,18 @@ void Tokenizer::simplifyStructDecl() while (!Token::Match(start, "struct|class|union|enum")) { after->insertToken(start->str()); after = after->next(); + after->column(start->column()); start->deleteThis(); } tok = start; if (!after) break; // see #4869 segmentation fault in Tokenizer::simplifyStructDecl (invalid code) after->insertToken(type->str()); + after->next()->column(type->column()); if (start->str() != "class") { after->insertToken(start->str()); after = after->next(); + after->column(start->column()); } after = after->tokAt(2); diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 45df39a4557..7eb3576f688 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -506,6 +506,10 @@ class TestTokenizer : public TestFixture { TEST_CASE(dumpFallthrough); TEST_CASE(simplifyRedundantParentheses); + + TEST_CASE(simplifyEnum1); + + TEST_CASE(simplifyEnum2); } class TokenizerTest : public Tokenizer @@ -8810,6 +8814,28 @@ class TestTokenizer : public TestFixture { SimpleTokenizer tokenizer(settingsDefault, *this, false); ASSERT_NO_THROW(tokenizer.tokenize(code)); } + + void simplifyEnum1() { + const char code[] = "static enum {A,B} ab;"; + ASSERT_EQUALS("enum Anonymous0 { A , B } ; static enum Anonymous0 ab ;", tokenizeAndStringify(code)); + SimpleTokenizer tokenizer(settingsDefault, *this); + tokenizer.tokenize(code); + const Token* tok = Token::findsimplematch(tokenizer.tokens(), "static"); + ASSERT(tok); + ASSERT_EQUALS(tok->column(), 1); + ASSERT_EQUALS(tok->next()->column(), 8); + } + + void simplifyEnum2() { + const char code[] = "enum AB {A,B}; enum AB static ab; "; + ASSERT_EQUALS("enum AB { A , B } ; static enum AB ab ;", tokenizeAndStringify(code)); + SimpleTokenizer tokenizer(settingsDefault, *this); + tokenizer.tokenize(code); + const Token* tok = Token::findsimplematch(tokenizer.tokens(), "static"); + ASSERT(tok); + ASSERT_EQUALS(tok->column(), 24); + ASSERT_EQUALS(tok->next()->column(), 16); + } }; REGISTER_TEST(TestTokenizer)