diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 0814b3f1d..218e45195 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -585,6 +585,8 @@ bool Tokenizer::tokenize(std::istream &code, const char FileName[]) * - try to change "for" loop to a "while" loop instead */ + simplifyConst(); + // Split up variable declarations. simplifyVarDecl(); @@ -4634,6 +4636,18 @@ void Tokenizer::simplifyComparisonOrder() } } +void Tokenizer::simplifyConst() +{ + for (Token *tok = _tokens; tok; tok = tok->next()) + { + if (Token::Match(tok, "[;{}(,] %type% const")) + { + tok->tokAt(2)->str(tok->tokAt(1)->str()); + tok->tokAt(1)->str("const"); + } + } +} + void Tokenizer::getErrorMessages() { syntaxError(0, ' '); diff --git a/lib/tokenize.h b/lib/tokenize.h index d94af2a14..65c7bc72f 100644 --- a/lib/tokenize.h +++ b/lib/tokenize.h @@ -315,6 +315,11 @@ private: */ void simplifyComparisonOrder(); + /** + * Change "int const x;" into "const int x;" + */ + void simplifyConst(); + /** * Remove exception specifications. This function calls itself recursively. * @param tok First token in scope to cleanup diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 2154d534d..b27a2a619 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -164,6 +164,7 @@ private: TEST_CASE(gt); // use "<" comparisons instead of ">" TEST_CASE(simplifyString); + TEST_CASE(simplifyConst); } @@ -2617,6 +2618,27 @@ private: ASSERT_EQUALS("\"a3\"", tokenizer->simplifyString("\"\\x333\"")); } + void simplifyConst() + { + ASSERT_EQUALS("void foo ( ) { const int x ; }", + tokenizeAndStringify("void foo(){ int const x;}")); + + ASSERT_EQUALS("void foo ( ) { { } const long x ; }", + tokenizeAndStringify("void foo(){ {} long const x;}")); + + ASSERT_EQUALS("void foo ( ) { bar ( ) ; const char x ; }", + tokenizeAndStringify("void foo(){ bar(); char const x;}")); + + ASSERT_EQUALS("void foo ( const char x ) { }", + tokenizeAndStringify("void foo(char const x){}")); + + ASSERT_EQUALS("void foo ( int b , const char x ) { }", + tokenizeAndStringify("void foo(int b,char const x){}")); + + ASSERT_EQUALS("void foo ( ) { int * const x ; }", + tokenizeAndStringify("void foo(){ int * const x;}")); + + } }; REGISTER_TEST(TestTokenizer)