@@ -50,6 +50,9 @@ class TestSimplifyTokens : public TestFixture {
5050 // foo(p = new char[10]); => p = new char[10]; foo(p);
5151 TEST_CASE (simplifyAssignmentInFunctionCall);
5252
53+ // ";a+=b;" => ";a=a+b;"
54+ TEST_CASE (simplifyCompoundAssignment);
55+
5356 TEST_CASE (cast);
5457 TEST_CASE (iftruefalse);
5558 TEST_CASE (combine_strings);
@@ -343,12 +346,73 @@ class TestSimplifyTokens : public TestFixture {
343346 tok (" ;while((x=f())==-1 && errno==EINTR){}" ,true ));
344347 }
345348
346-
347349 void simplifyAssignmentInFunctionCall () {
348350 ASSERT_EQUALS (" ; x = g ( ) ; f ( x ) ;" , tok (" ;f(x=g());" ));
349351 ASSERT_EQUALS (" ; hs = ( xyz_t ) { h . centerX , h . centerY , 1 + index } ; putInput ( hs , 1 ) ;" , tok (" ;putInput(hs = (xyz_t) { h->centerX, h->centerY, 1 + index }, 1);" ));
350352 }
351353
354+ void simplifyCompoundAssignment () {
355+ ASSERT_EQUALS (" ; x = x + y ;" , tok (" ; x += y;" ));
356+ ASSERT_EQUALS (" ; x = x - y ;" , tok (" ; x -= y;" ));
357+ ASSERT_EQUALS (" ; x = x * y ;" , tok (" ; x *= y;" ));
358+ ASSERT_EQUALS (" ; x = x / y ;" , tok (" ; x /= y;" ));
359+ ASSERT_EQUALS (" ; x = x % y ;" , tok (" ; x %= y;" ));
360+ ASSERT_EQUALS (" ; x = x & y ;" , tok (" ; x &= y;" ));
361+ ASSERT_EQUALS (" ; x = x | y ;" , tok (" ; x |= y;" ));
362+ ASSERT_EQUALS (" ; x = x ^ y ;" , tok (" ; x ^= y;" ));
363+ ASSERT_EQUALS (" ; x = x << y ;" , tok (" ; x <<= y;" ));
364+ ASSERT_EQUALS (" ; x = x >> y ;" , tok (" ; x >>= y;" ));
365+
366+ ASSERT_EQUALS (" { x = x + y ; }" , tok (" { x += y;}" ));
367+ ASSERT_EQUALS (" { x = x - y ; }" , tok (" { x -= y;}" ));
368+ ASSERT_EQUALS (" { x = x * y ; }" , tok (" { x *= y;}" ));
369+ ASSERT_EQUALS (" { x = x / y ; }" , tok (" { x /= y;}" ));
370+ ASSERT_EQUALS (" { x = x % y ; }" , tok (" { x %= y;}" ));
371+ ASSERT_EQUALS (" { x = x & y ; }" , tok (" { x &= y;}" ));
372+ ASSERT_EQUALS (" { x = x | y ; }" , tok (" { x |= y;}" ));
373+ ASSERT_EQUALS (" { x = x ^ y ; }" , tok (" { x ^= y;}" ));
374+ ASSERT_EQUALS (" { x = x << y ; }" , tok (" { x <<= y;}" ));
375+ ASSERT_EQUALS (" { x = x >> y ; }" , tok (" { x >>= y;}" ));
376+
377+ ASSERT_EQUALS (" ; * p = * p + y ;" , tok (" ; *p += y;" ));
378+ ASSERT_EQUALS (" ; ( * p ) = ( * p ) + y ;" , tok (" ; (*p) += y;" ));
379+ ASSERT_EQUALS (" ; * ( p [ 0 ] ) = * ( p [ 0 ] ) + y ;" , tok (" ; *(p[0]) += y;" ));
380+ ASSERT_EQUALS (" ; p [ { 1 , 2 } ] = p [ { 1 , 2 } ] + y ;" , tok (" ; p[{1,2}] += y;" ));
381+
382+ ASSERT_EQUALS (" void foo ( ) { switch ( n ) { case 0 : ; x = x + y ; break ; } }" , tok (" void foo() { switch (n) { case 0: x += y; break; } }" ));
383+
384+ ASSERT_EQUALS (" ; x . y = x . y + 1 ;" , tok (" ; x.y += 1;" ));
385+
386+ ASSERT_EQUALS (" ; x [ 0 ] = x [ 0 ] + 1 ;" , tok (" ; x[0] += 1;" ));
387+ ASSERT_EQUALS (" ; x [ y - 1 ] = x [ y - 1 ] + 1 ;" , tok (" ; x[y-1] += 1;" ));
388+ ASSERT_EQUALS (" ; x [ y ] = x [ y ++ ] + 1 ;" , tok (" ; x[y++] += 1;" ));
389+ ASSERT_EQUALS (" ; x [ ++ y ] = x [ y ] + 1 ;" , tok (" ; x[++y] += 1;" ));
390+
391+ ASSERT_EQUALS (" ;" , tok (" ;x += 0;" ));
392+ ASSERT_EQUALS (" ;" , tok (" ;x += '\\ 0';" ));
393+ ASSERT_EQUALS (" ;" , tok (" ;x -= 0;" ));
394+ ASSERT_EQUALS (" ;" , tok (" ;x |= 0;" ));
395+ ASSERT_EQUALS (" ;" , tok (" ;x *= 1;" ));
396+ ASSERT_EQUALS (" ;" , tok (" ;x /= 1;" ));
397+
398+ ASSERT_EQUALS (" ; a . x ( ) = a . x ( ) + 1 ;" , tok (" ; a.x() += 1;" ));
399+ ASSERT_EQUALS (" ; x ( 1 ) = x ( 1 ) + 1 ;" , tok (" ; x(1) += 1;" ));
400+
401+ // #2368
402+ ASSERT_EQUALS (" { j = j - i ; }" , tok (" if (false) {} else { j -= i; }" ));
403+
404+ // #2714 - wrong simplification of "a += b?c:d;"
405+ ASSERT_EQUALS (" ; a = a + ( b ? c : d ) ;" , tok (" ; a+=b?c:d;" ));
406+ ASSERT_EQUALS (" ; a = a * ( b + 1 ) ;" , tok (" ; a*=b+1;" ));
407+
408+ ASSERT_EQUALS (" ; a = a + ( b && c ) ;" , tok (" ; a+=b&&c;" ));
409+ ASSERT_EQUALS (" ; a = a * ( b || c ) ;" , tok (" ; a*=b||c;" ));
410+ ASSERT_EQUALS (" ; a = a | ( b == c ) ;" , tok (" ; a|=b==c;" ));
411+
412+ // #3469
413+ ASSERT_EQUALS (" ; a = a + ( b = 1 ) ;" , tok (" ; a += b = 1;" ));
414+ }
415+
352416
353417 void cast () {
354418 ASSERT_EQUALS (" if ( p == 0 ) { ; }" , tok (" if (p == (char *)0);" ));
@@ -1715,7 +1779,7 @@ class TestSimplifyTokens : public TestFixture {
17151779 }
17161780
17171781 void cAlternativeTokens () {
1718- ASSERT_EQUALS (" void f ( ) { err = err | ( ( r & s ) && ! t ) ; }" ,
1782+ ASSERT_EQUALS (" void f ( ) { err |= ( ( r & s ) && ! t ) ; }" ,
17191783 tok (" void f() { err or_eq ((r bitand s) and not t); }" , " test.c" , false ));
17201784 ASSERT_EQUALS (" void f ( ) const { r = f ( a [ 4 ] | 15 , ~ c , ! d ) ; }" ,
17211785 tok (" void f() const { r = f(a[4] bitor 0x0F, compl c, not d) ; }" , " test.c" , false ));
0 commit comments