diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 9a8343226..357035d53 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -4928,9 +4928,22 @@ void Tokenizer::removeRedundantSemicolons() { tok = tok->link(); } - while (Token::simpleMatch(tok, "; ;")) + for (;;) { - tok->deleteNext(); + if (Token::simpleMatch(tok, "; ;")) + { + tok->deleteNext(); + } + else if (Token::simpleMatch(tok, "; { ; }")) + { + tok->deleteNext(); + tok->deleteNext(); + tok->deleteNext(); + } + else + { + break; + } } } } @@ -5270,14 +5283,31 @@ void Tokenizer::simplifyConditionOperator() ++parlevel; else if (tok->str() == ")") --parlevel; - else if (parlevel == 0 && Token::Match(tok, "; %var% = %var% ? %var% : %var% ;")) + else if (parlevel == 0 && Token::Match(tok, ";|{|} *| %any% = %any% ? %any% : %any% ;")) { - const std::string var(tok->strAt(1)); + std::string var(tok->strAt(1)); + bool isPointer = false; + if (Token::simpleMatch(tok->next(), "*")) + { + tok = tok->next(); + var += " " + tok->strAt(1); + isPointer = true; + } + const std::string condition(tok->strAt(3)); const std::string value1(tok->strAt(5)); const std::string value2(tok->strAt(7)); - Token::eraseTokens(tok, tok->tokAt(9)); + if (isPointer) + { + tok = tok->previous(); + Token::eraseTokens(tok, tok->tokAt(10)); + } + else + { + Token::eraseTokens(tok, tok->tokAt(9)); + } + std::string str("if ( " + condition + " ) { " + var + " = " + value1 + " ; } else { " + var + " = " + value2 + " ; }"); std::string::size_type pos1 = 0; @@ -5297,9 +5327,18 @@ void Tokenizer::simplifyConditionOperator() tok = tok->next(); } - Token::createMutualLinks(tok->tokAt(-15), tok->tokAt(-13)); - Token::createMutualLinks(tok->tokAt(-12), tok->tokAt(-7)); - Token::createMutualLinks(tok->tokAt(-5), tok); + if (isPointer) + { + Token::createMutualLinks(tok->tokAt(-17), tok->tokAt(-15)); + Token::createMutualLinks(tok->tokAt(-14), tok->tokAt(-8)); + Token::createMutualLinks(tok->tokAt(-6), tok); + } + else + { + Token::createMutualLinks(tok->tokAt(-15), tok->tokAt(-13)); + Token::createMutualLinks(tok->tokAt(-12), tok->tokAt(-7)); + Token::createMutualLinks(tok->tokAt(-5), tok); + } } } } diff --git a/test/testmemleak.cpp b/test/testmemleak.cpp index aa67f98fa..21c887eaa 100644 --- a/test/testmemleak.cpp +++ b/test/testmemleak.cpp @@ -484,7 +484,6 @@ private: ASSERT_EQUALS(";;use;;", getcode("char *s; x = {1,s};", "s")); ASSERT_EQUALS(";{};;alloc;;use;", getcode("struct Foo { }; Foo *p; p = malloc(10); const Foo *q; q = p;", "p")); ASSERT_EQUALS(";;alloc;use;", getcode("Fred *fred; p.setFred(fred = new Fred);", "fred")); - ASSERT_EQUALS(";;use;", getcode("char *s; *s2 = s ? s : p;", "s")); // non-use.. ASSERT_EQUALS(";;", getcode("char *s; s = s + 1;", "s")); diff --git a/test/testsimplifytokens.cpp b/test/testsimplifytokens.cpp index 6c8dcdaee..5f169d74a 100644 --- a/test/testsimplifytokens.cpp +++ b/test/testsimplifytokens.cpp @@ -485,7 +485,7 @@ private: { const char code1[] = "void f() { int a; bool use = true; if( use ) a=0; else if( bb ) a=1; else if( cc ) a=33; else { gg = 0; } int c=1; }"; - const char code2[] = "void f ( ) { ; { ; } ; }"; + const char code2[] = "void f ( ) { ; }"; ASSERT_EQUALS(code2, tok(code1)); } @@ -2698,6 +2698,34 @@ private: const char code[] = "= 1 ? 0 : ({ 0; });"; ASSERT_EQUALS("= 0 ;", tok(code)); } + + { + const char code[] = "int f(int b, int d)\n" + "{\n" + " d = b ? b : 10;\n" + " return d;\n" + "}\n"; + ASSERT_EQUALS("int f ( int b , int d ) { if ( b ) { d = b ; } else { d = 10 ; } return d ; }", tok(code)); + } + + { + const char code[] = "int f(int b, int *d)\n" + "{\n" + " *d = b ? b : 10;\n" + " return *d;\n" + "}\n"; + ASSERT_EQUALS("int f ( int b , int * d ) { if ( b ) { * d = b ; } else { * d = 10 ; } return * d ; }", tok(code)); + } + + { + const char code[] = "int f(int b, int *d)\n" + "{\n" + " if(b) {b++;}" + " *d = b ? b : 10;\n" + " return *d;\n" + "}\n"; + ASSERT_EQUALS("int f ( int b , int * d ) { if ( b ) { b ++ ; } if ( b ) { * d = b ; } else { * d = 10 ; } return * d ; }", tok(code)); + } } void calculations() diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 5123f94b7..5e133f9cf 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -2048,7 +2048,7 @@ private: const char expected[] = "void f ( ) {\n" ";\n" "\n" - "{ ; }\n" + "\n" "}"; ASSERT_EQUALS(expected, tokenizeAndStringify(code, true)); }