From: Jakub Jelinek Date: Thu, 7 Jul 2011 19:41:55 +0000 (+0200) Subject: re PR c/49644 (post-increment of promoted operand is incorrect.) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e834d8486a88ee5664c0c2e17b4c2dbd811c0c65;p=gcc.git re PR c/49644 (post-increment of promoted operand is incorrect.) PR c/49644 * typeck.c (cp_build_binary_op): For MULT_EXPR and TRUNC_DIV_EXPR with one non-complex and one complex argument, call save_expr on both operands. * g++.dg/torture/pr49644.C: New test. From-SVN: r176006 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3957d5ade63..c5c83d035ae 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2011-07-07 Jakub Jelinek + + PR c/49644 + * typeck.c (cp_build_binary_op): For MULT_EXPR and TRUNC_DIV_EXPR with + one non-complex and one complex argument, call save_expr on both + operands. + 2011-07-06 Jason Merrill PR c++/49353 diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 7af76b1be76..2acb18efbae 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -4338,6 +4338,7 @@ cp_build_binary_op (location_t location, { case MULT_EXPR: case TRUNC_DIV_EXPR: + op1 = save_expr (op1); imag = build2 (resultcode, real_type, imag, op1); /* Fall through. */ case PLUS_EXPR: @@ -4356,6 +4357,7 @@ cp_build_binary_op (location_t location, switch (code) { case MULT_EXPR: + op0 = save_expr (op0); imag = build2 (resultcode, real_type, op0, imag); /* Fall through. */ case PLUS_EXPR: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a7eda91c69e..3aa5f91273c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2011-07-07 Jakub Jelinek + PR c/49644 + * g++.dg/torture/pr49644.C: New test. + PR c/49644 * gcc.c-torture/execute/pr49644.c: New test. diff --git a/gcc/testsuite/g++.dg/torture/pr49644.C b/gcc/testsuite/g++.dg/torture/pr49644.C new file mode 100644 index 00000000000..5fb82e0177e --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr49644.C @@ -0,0 +1,17 @@ +// PR c/49644 +// { dg-do run } + +extern "C" void abort (); + +int +main () +{ + _Complex double a[12], *c = a, s = 3.0 + 1.0i; + double b[12] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }, *d = b; + int i; + for (i = 0; i < 6; i++) + *c++ = *d++ * s; + if (c != a + 6 || d != b + 6) + abort (); + return 0; +}