From 03944f1b963268999f2f2ec2ddf8365bd8428f62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 19 Jun 2009 19:25:56 +0200 Subject: [PATCH] Tokenizer: Fixed problem when simplifying casts --- src/tokenize.cpp | 41 ++++++++++++++++++++----------------- test/testsimplifytokens.cpp | 25 ++++++++++++++++------ 2 files changed, 41 insertions(+), 25 deletions(-) diff --git a/src/tokenize.cpp b/src/tokenize.cpp index dd2d58374..9507a2993 100644 --- a/src/tokenize.cpp +++ b/src/tokenize.cpp @@ -1939,36 +1939,39 @@ bool Tokenizer::simplifyCasts() else if (Token::Match(tok->next(), "dynamic_cast|reinterpret_cast|const_cast|static_cast <")) { + Token *tok2 = tok->next(); unsigned int level = 0; - while (tok->next()) + while (tok2) { - const Token *next = tok->next(); - if (next->str() == "<") + if (tok2->str() == "<") ++level; - else if (next->str() == ">") + else if (tok2->str() == ">") { --level; if (level == 0) break; } - tok->deleteNext(); - } - tok->deleteNext(); - tok->deleteNext(); - Token *tok2 = tok; - int parlevel = 0; - while (tok2->next() && parlevel >= 0) - { tok2 = tok2->next(); - if (Token::simpleMatch(tok2->next(), "(")) - ++parlevel; - else if (Token::simpleMatch(tok2->next(), ")")) - --parlevel; } - if (tok2->next()) - tok2->deleteNext(); - ret = true; + if (Token::simpleMatch(tok2, "> (")) + { + Token::eraseTokens(tok, tok2->tokAt(2)); + tok2 = tok; + int parlevel = 0; + while (tok2->next() && parlevel >= 0) + { + tok2 = tok2->next(); + if (Token::simpleMatch(tok2->next(), "(")) + ++parlevel; + else if (Token::simpleMatch(tok2->next(), ")")) + --parlevel; + } + if (tok2->next()) + tok2->deleteNext(); + + ret = true; + } } } diff --git a/test/testsimplifytokens.cpp b/test/testsimplifytokens.cpp index 8808b601d..5f4763257 100644 --- a/test/testsimplifytokens.cpp +++ b/test/testsimplifytokens.cpp @@ -593,14 +593,27 @@ private: void casting() { - const char code[] = "void f()\n" - "{\n" - "for (int i = 0; i < static_cast(3); ++i) {}\n" - "}\n"; + { + const char code[] = "void f()\n" + "{\n" + "for (int i = 0; i < static_cast(3); ++i) {}\n" + "}\n"; - const std::string expected(" void f ( ) { for ( int i = 0 ; i < 3 ; ++ i ) { } }"); + const std::string expected(" void f ( ) { for ( int i = 0 ; i < 3 ; ++ i ) { } }"); - ASSERT_EQUALS(expected, sizeof_(code)); + ASSERT_EQUALS(expected, sizeof_(code)); + } + + { + const char code[] = "void f()\n" + "{\n" + " p = const_cast qtu ();\n" + "}\n"; + + const std::string expected(" void f ( ) { p = const_cast < char * > qtu ( ) ; }"); + + ASSERT_EQUALS(expected, sizeof_(code)); + } }