From b1230f6f577ec808d4253f66fbb2bc90a318e3a4 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 19 Jul 2011 15:07:23 +0200 Subject: [PATCH] backport: re PR c/49644 (post-increment of promoted operand is incorrect.) Backport from mainline 2011-07-07 Jakub Jelinek PR c/49644 * c-typeck.c (build_binary_op): For MULT_EXPR and TRUNC_DIV_EXPR with one non-complex and one complex argument, call c_save_expr on both operands. * gcc.c-torture/execute/pr49644.c: New test. From-SVN: r176456 --- gcc/ChangeLog | 5 +++++ gcc/c-typeck.c | 2 ++ gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/gcc.c-torture/execute/pr49644.c | 16 ++++++++++++++++ 4 files changed, 26 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr49644.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index be911bca5785..13ce2dee8dc5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -3,6 +3,11 @@ Backport from mainline 2011-07-07 Jakub Jelinek + PR c/49644 + * c-typeck.c (build_binary_op): For MULT_EXPR and TRUNC_DIV_EXPR with + one non-complex and one complex argument, call c_save_expr on both + operands. + PR middle-end/49640 * gimplify.c (gimplify_compound_lval): For last 2 ARRAY_*REF operands and last COMPONENT_REF operand call gimplify_expr on it diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index e1ba16b1fe1f..66b95127aba5 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -9655,6 +9655,7 @@ build_binary_op (location_t location, enum tree_code code, { case MULT_EXPR: case TRUNC_DIV_EXPR: + op1 = c_save_expr (op1); imag = build2 (resultcode, real_type, imag, op1); /* Fall through. */ case PLUS_EXPR: @@ -9675,6 +9676,7 @@ build_binary_op (location_t location, enum tree_code code, switch (code) { case MULT_EXPR: + op0 = c_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 209f4a2c03be..d758a7612e64 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -3,6 +3,9 @@ Backport from mainline 2011-07-07 Jakub Jelinek + PR c/49644 + * gcc.c-torture/execute/pr49644.c: New test. + PR middle-end/49640 * gcc.dg/gomp/pr49640.c: New test. diff --git a/gcc/testsuite/gcc.c-torture/execute/pr49644.c b/gcc/testsuite/gcc.c-torture/execute/pr49644.c new file mode 100644 index 000000000000..88be23c40a9f --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr49644.c @@ -0,0 +1,16 @@ +/* PR c/49644 */ + +extern void abort (void); + +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; +} -- 2.47.2