From 7431b56c9dfdcdcd6c349b8bd46a2e1821a575f9 Mon Sep 17 00:00:00 2001 From: burnus Date: Sun, 5 May 2013 14:04:07 +0000 Subject: 2013-05-05 Tobias Burnus * resolve.c (conformable_arrays): Avoid segfault when ar.start[i] == NULL. 2013-05-05 Tobias Burnus * gfortran.dg/allocate_with_source_3.f90: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@198610 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 5 ++++ gcc/fortran/resolve.c | 3 +++ gcc/testsuite/ChangeLog | 4 ++++ .../gfortran.dg/allocate_with_source_3.f90 | 28 ++++++++++++++++++++++ 4 files changed, 40 insertions(+) create mode 100644 gcc/testsuite/gfortran.dg/allocate_with_source_3.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index d595cf29f7a..66b20c0457c 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2013-05-05 Tobias Burnus + + * resolve.c (conformable_arrays): Avoid segfault + when ar.start[i] == NULL. + 2013-05-05 Tobias Burnus PR fortran/57141 diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 2860e4127b5..e27b23b2a54 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -6508,6 +6508,9 @@ conformable_arrays (gfc_expr *e1, gfc_expr *e2) for (i = 0; i < e1->rank; i++) { + if (tail->u.ar.start[i] == NULL) + break; + if (tail->u.ar.end[i]) { mpz_set (s, tail->u.ar.end[i]->value.integer); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2dde9c6482e..e383f089e72 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2013-05-05 Tobias Burnus + + * gfortran.dg/allocate_with_source_3.f90: New. + 2013-05-05 Tobias Burnus PR fortran/57141 diff --git a/gcc/testsuite/gfortran.dg/allocate_with_source_3.f90 b/gcc/testsuite/gfortran.dg/allocate_with_source_3.f90 new file mode 100644 index 00000000000..f7e010948ac --- /dev/null +++ b/gcc/testsuite/gfortran.dg/allocate_with_source_3.f90 @@ -0,0 +1,28 @@ +! { dg-do compile } +! +! Contributed by Reinhold Bader +! +program assumed_shape_01 + use, intrinsic :: iso_c_binding + implicit none + type, bind(c) :: cstruct + integer(c_int) :: i + real(c_float) :: r(2) + end type cstruct + interface + subroutine psub(this, that) bind(c, name='Psub') + import :: c_float, cstruct + real(c_float) :: this(:,:) + type(cstruct) :: that(:) + end subroutine psub + end interface + + real(c_float) :: t(3,7) + type(cstruct), pointer :: u(:) + +! The following is VALID Fortran 2008 but NOT YET supported + allocate(u, source=[cstruct( 4, [1.1,2.2] ) ]) ! { dg-error "Array specification required in ALLOCATE statement" } + call psub(t, u) + deallocate (u) + +end program assumed_shape_01 -- cgit v1.2.1