re PR fortran/29758 (Runtime segfault in RESHAPE with insufficient elements in SOURCE)
2006-11-10 Paul Thomas <pault@gcc.gnu.org> PR fortran/29758 * check.c (gfc_check_reshape): Check that there are enough elements in the source array as to be able to fill an array defined by shape, when pad is absent. 2006-11-10 Paul Thomas <pault@gcc.gnu.org> PR fortran/29758 * gfortran.dg/reshape_source_size_1.f90: New test. From-SVN: r118664
This commit is contained in:
parent
f70d742fc8
commit
d8d8121add
4 changed files with 54 additions and 3 deletions
|
@ -1,7 +1,9 @@
|
|||
2006-11-10 Tobias Burnus <burnus@net-b.de>
|
||||
2006-11-10 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/29454
|
||||
* resolve.c (gfc_resolve_blocks): Fix error message.
|
||||
PR fortran/29758
|
||||
* check.c (gfc_check_reshape): Check that there are enough
|
||||
elements in the source array as to be able to fill an array
|
||||
defined by shape, when pad is absent.
|
||||
|
||||
2006-11-10 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
|
|
|
@ -2110,6 +2110,7 @@ gfc_check_reshape (gfc_expr * source, gfc_expr * shape,
|
|||
gfc_expr * pad, gfc_expr * order)
|
||||
{
|
||||
mpz_t size;
|
||||
mpz_t nelems;
|
||||
int m;
|
||||
|
||||
if (array_check (source, 0) == FAILURE)
|
||||
|
@ -2149,6 +2150,38 @@ gfc_check_reshape (gfc_expr * source, gfc_expr * shape,
|
|||
if (order != NULL && array_check (order, 3) == FAILURE)
|
||||
return FAILURE;
|
||||
|
||||
if (pad == NULL
|
||||
&& shape->expr_type == EXPR_ARRAY
|
||||
&& gfc_is_constant_expr (shape)
|
||||
&& !(source->expr_type == EXPR_VARIABLE
|
||||
&& source->symtree->n.sym->as
|
||||
&& source->symtree->n.sym->as->type == AS_ASSUMED_SIZE))
|
||||
{
|
||||
/* Check the match in size between source and destination. */
|
||||
if (gfc_array_size (source, &nelems) == SUCCESS)
|
||||
{
|
||||
gfc_constructor *c;
|
||||
bool test;
|
||||
|
||||
c = shape->value.constructor;
|
||||
mpz_init_set_ui (size, 1);
|
||||
for (; c; c = c->next)
|
||||
mpz_mul (size, size, c->expr->value.integer);
|
||||
|
||||
test = mpz_cmp (nelems, size) < 0 && mpz_cmp_ui (size, 0) > 0;
|
||||
mpz_clear (nelems);
|
||||
mpz_clear (size);
|
||||
|
||||
if (test)
|
||||
{
|
||||
gfc_error ("Without padding, there are not enough elements in the "
|
||||
"intrinsic RESHAPE source at %L to match the shape",
|
||||
&source->where);
|
||||
return FAILURE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2006-11-10 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/29758
|
||||
* gfortran.dg/reshape_source_size_1.f90: New test.
|
||||
|
||||
2006-11-10 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/29315
|
||||
|
|
11
gcc/testsuite/gfortran.dg/reshape_source_size_1.f90
Normal file
11
gcc/testsuite/gfortran.dg/reshape_source_size_1.f90
Normal file
|
@ -0,0 +1,11 @@
|
|||
! { dg-do compile }
|
||||
! Tests patch for PR29758, which arose from PR29431. There was no check that there
|
||||
! were enough elements in the source to match the shape.
|
||||
!
|
||||
! Contributed by Paul Thomas <pault@gcc.gnu.org>
|
||||
!
|
||||
real :: a(2,2), b = 1.0, c(3), d(4)
|
||||
a = reshape ([b], [2,2]) ! { dg-error "not enough elements" }
|
||||
a = reshape (c, [2,2]) ! { dg-error "not enough elements" }
|
||||
a = reshape (d, [2,2])
|
||||
end
|
Loading…
Add table
Reference in a new issue