Commit 4f68f111 by Francois-Xavier Coudert Committed by François-Xavier Coudert

re PR fortran/33288 (ICE (segfault) in mpfr_cmp2 when evaluating array…

re PR fortran/33288 (ICE (segfault) in mpfr_cmp2 when evaluating array initializers containing addition)

	PR fortran/33288

	* arith.c (reduce_unary, reduce_binary_ac, reduce_binary_ca,
	reduce_binary_aa): Call ourselves recursively if an element of
	the constructor is itself a constant array.

	* gfortran.dg/array_constructor_19.f90: New test.

From-SVN: r128632
parent cc459ab4
2007-09-20 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
PR fortran/33288
* arith.c (reduce_unary, reduce_binary_ac, reduce_binary_ca,
reduce_binary_aa): Call ourselves recursively if an element of
the constructor is itself a constant array.
2007-09-20 Tobias Schlüter <tobi@gcc.gnu.org> 2007-09-20 Tobias Schlüter <tobi@gcc.gnu.org>
* io.c (resolve_tag_format): New function using code split out * io.c (resolve_tag_format): New function using code split out
......
...@@ -1288,7 +1288,8 @@ reduce_unary (arith (*eval) (gfc_expr *, gfc_expr **), gfc_expr *op, ...@@ -1288,7 +1288,8 @@ reduce_unary (arith (*eval) (gfc_expr *, gfc_expr **), gfc_expr *op,
for (c = head; c; c = c->next) for (c = head; c; c = c->next)
{ {
rc = eval (c->expr, &r); rc = reduce_unary (eval, c->expr, &r);
if (rc != ARITH_OK) if (rc != ARITH_OK)
break; break;
...@@ -1328,7 +1329,11 @@ reduce_binary_ac (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **), ...@@ -1328,7 +1329,11 @@ reduce_binary_ac (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
for (c = head; c; c = c->next) for (c = head; c; c = c->next)
{ {
rc = eval (c->expr, op2, &r); if (c->expr->expr_type == EXPR_CONSTANT)
rc = eval (c->expr, op2, &r);
else
rc = reduce_binary_ac (eval, c->expr, op2, &r);
if (rc != ARITH_OK) if (rc != ARITH_OK)
break; break;
...@@ -1368,7 +1373,11 @@ reduce_binary_ca (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **), ...@@ -1368,7 +1373,11 @@ reduce_binary_ca (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
for (c = head; c; c = c->next) for (c = head; c; c = c->next)
{ {
rc = eval (op1, c->expr, &r); if (c->expr->expr_type == EXPR_CONSTANT)
rc = eval (op1, c->expr, &r);
else
rc = reduce_binary_ca (eval, op1, c->expr, &r);
if (rc != ARITH_OK) if (rc != ARITH_OK)
break; break;
...@@ -1395,6 +1404,11 @@ reduce_binary_ca (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **), ...@@ -1395,6 +1404,11 @@ reduce_binary_ca (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
} }
/* We need a forward declaration of reduce_binary. */
static arith reduce_binary (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
gfc_expr *op1, gfc_expr *op2, gfc_expr **result);
static arith static arith
reduce_binary_aa (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **), reduce_binary_aa (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
gfc_expr *op1, gfc_expr *op2, gfc_expr **result) gfc_expr *op1, gfc_expr *op2, gfc_expr **result)
...@@ -1421,7 +1435,7 @@ reduce_binary_aa (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **), ...@@ -1421,7 +1435,7 @@ reduce_binary_aa (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **),
break; break;
} }
rc = eval (c->expr, d->expr, &r); rc = reduce_binary (eval, c->expr, d->expr, &r);
if (rc != ARITH_OK) if (rc != ARITH_OK)
break; break;
......
2007-09-20 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
PR fortran/33288
* gfortran.dg/array_constructor_19.f90: New test.
2007-09-20 Jakub Jelinek <jakub@redhat.com> 2007-09-20 Jakub Jelinek <jakub@redhat.com>
PR debug/33316 PR debug/33316
! Simplification of unary and binary expressions containing
! array constructors.
!
! See PR33288
!
! { dg-do run }
real, parameter :: x(1) = 42
real, parameter :: x1(1) = (/ x /) + 1
real, parameter :: x2(1) = 1 + (/ x /)
real, parameter :: x3(1) = -(/ x /)
real, parameter :: x4(2) = (/ x, 1. /) + (/ 2, (/3/) /)
if (any (x1 /= (/43./))) call abort
if (any (x2 /= (/43./))) call abort
if (any (x3 /= (/-42./))) call abort
if (any (x4 /= (/44., 4./))) call abort
end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment