diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 4caffa888..5c85ff874 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -7831,13 +7831,15 @@ bool Tokenizer::simplifyCalculations() tok->deleteThis(); ret = true; } - else if (Token::Match(tok->previous(), "[=([,] 0 [+|]")) + else if (Token::Match(tok->previous(), "[=([,] 0 [+|]") || + Token::Match(tok->previous(), "return|case 0 [+|]")) { tok->deleteThis(); tok->deleteThis(); ret = true; } - else if (Token::Match(tok->previous(), "[=[(,] 0 * %any% ,|]|)|;|%op%")) + else if (Token::Match(tok->previous(), "[=[(,] 0 * %any% ,|]|)|;|=|%op%") || + Token::Match(tok->previous(), "return|case 0 * %any% ,|:|;|=|%op%")) { tok->deleteNext(); if (tok->next()->str() == "(") @@ -7939,7 +7941,8 @@ bool Tokenizer::simplifyCalculations() Token::Match(tok, "[[,(=<>+-*|&^] %num% [+-*/] %num% <<|>>") || Token::Match(tok, "<< %num% [+-*/] %num% <<") || Token::Match(tok, "[(,[] %num% [|&^] %num% [];,);]") || - Token::Match(tok, "(|%op% %num% [+-*/] %num% )|%op%")) + Token::Match(tok, "(|%op% %num% [+-*/] %num% )|%op%") || + Token::Match(tok,"return|case %num% [+-*/] %num% ;|,|=|:|%op%")) { tok = tok->next(); diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index b43aa7226..b8eed846d 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -5679,6 +5679,19 @@ private: tokenizeAndStringify("void foo ( int b ) { int a = b | 0 ; bar ( a ) ; }", true)); ASSERT_EQUALS("void foo ( int b ) { int a ; a = b ; bar ( a ) ; }", tokenizeAndStringify("void foo ( int b ) { int a = 0 | b ; bar ( a ) ; }", true)); + + // ticket #3093 + ASSERT_EQUALS("int f ( ) { ; return 15 ; }", + tokenizeAndStringify("int f() { int a = 10; int b = 5; return a + b; }", true)); + ASSERT_EQUALS("int f ( ) { return a ; }", + tokenizeAndStringify("int f() { return a * 1; }", true)); + ASSERT_EQUALS("int f ( int a ) { return 0 ; }", + tokenizeAndStringify("int f(int a) { return 0 * a; }", true)); + ASSERT_EQUALS("bool f ( int i ) { switch ( i ) { case 15 : ; return true ; } }", + tokenizeAndStringify("bool f(int i) { switch (i) { case 10 + 5: return true; } }", true)); + TODO_ASSERT_EQUALS("bool f ( int i ) { ; switch ( i ) { case 15 : ; return true ; } }", + "bool f ( int i ) { int a ; a = 10 ; int b ; b = 5 ; switch ( i ) { case a + b : return true ; } }", + tokenizeAndStringify("bool f(int i) { int a = 10; int b = 5; switch (i) { case a + b: return true; } }", true)); } void simplifyCompoundAssignment()