diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2017-11-10 12:24:24 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2017-11-10 12:24:24 +0000 |
commit | 8cd119d857b727ce0ee7b3c7aead38d8fdcc1a7e (patch) | |
tree | 14b398d7e1063d2eaaec7b3e0c7797797beeb428 /gcc | |
parent | 9e875fd864e1ddf636c015a35985bccf732b645a (diff) | |
download | gcc-8cd119d857b727ce0ee7b3c7aead38d8fdcc1a7e.zip gcc-8cd119d857b727ce0ee7b3c7aead38d8fdcc1a7e.tar.gz gcc-8cd119d857b727ce0ee7b3c7aead38d8fdcc1a7e.tar.bz2 |
re PR fortran/82934 (Segfault on assumed character length in allocate)
2017-11-10 Paul Thomas <pault@gcc.gnu.org>
PR fortran/82934
* trans-stmt.c (gfc_trans_allocate): Remove the gcc_assert on
null string length for assumed length typespec and set
expr3_esize to NULL_TREE;
2017-11-10 Paul Thomas <pault@gcc.gnu.org>
PR fortran/82934
* gfortran.dg/allocate_assumed_charlen_1.f90: New test.
From-SVN: r254624
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fortran/trans-stmt.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/allocate_assumed_charlen_1.f90 | 28 |
4 files changed, 43 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 7d01627..fb067aa 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2017-11-10 Paul Thomas <pault@gcc.gnu.org> + + PR fortran/82934 + * trans-stmt.c (gfc_trans_allocate): Remove the gcc_assert on + null string length for assumed length typespec and set + expr3_esize to NULL_TREE; + 2017-11-09 Paul Thomas <pault@gcc.gnu.org> PR fortran/78619 diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c index d058e5f..ea0f952 100644 --- a/gcc/fortran/trans-stmt.c +++ b/gcc/fortran/trans-stmt.c @@ -5913,10 +5913,9 @@ gfc_trans_allocate (gfc_code * code) if (code->ext.alloc.ts.type != BT_CHARACTER) expr3_esize = TYPE_SIZE_UNIT ( gfc_typenode_for_spec (&code->ext.alloc.ts)); - else + else if (code->ext.alloc.ts.u.cl->length != NULL) { gfc_expr *sz; - gcc_assert (code->ext.alloc.ts.u.cl->length != NULL); sz = gfc_copy_expr (code->ext.alloc.ts.u.cl->length); gfc_init_se (&se_sz, NULL); gfc_conv_expr (&se_sz, sz); @@ -5930,6 +5929,8 @@ gfc_trans_allocate (gfc_code * code) tmp, se_sz.expr); expr3_esize = gfc_evaluate_now (expr3_esize, &block); } + else + expr3_esize = NULL_TREE; } /* The routine gfc_trans_assignment () already implements all diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a543e4f..620044a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-11-10 Paul Thomas <pault@gcc.gnu.org> + + PR fortran/82934 + * gfortran.dg/allocate_assumed_charlen_1.f90: New test. + 2017-11-10 Jakub Jelinek <jakub@redhat.com> PR bootstrap/82916 diff --git a/gcc/testsuite/gfortran.dg/allocate_assumed_charlen_1.f90 b/gcc/testsuite/gfortran.dg/allocate_assumed_charlen_1.f90 new file mode 100644 index 0000000..382df36 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/allocate_assumed_charlen_1.f90 @@ -0,0 +1,28 @@ +! { dg-do run } +! +! PR82934: Segfault on compilation in trans-stmt.c:5919(8.0.0). +! The original report only had one item in the allocate list. This +! has been doubled up to verify that the correct string length is +! is used in the allocation. +! +! Contributed by FortranFan on clf. +! + character(len=42), allocatable :: foo + character(len=22), allocatable :: foofoo + + call alloc( foo , foofoo) + + if (len(foo) .ne. 42) call abort + if (len(foofoo) .ne. 22) call abort + +contains + + subroutine alloc( bar, barbar ) + + character(len=*), allocatable :: bar, barbar + + allocate( character(len=*) :: bar , barbar) ! <= Here! + + end subroutine + +end |