From a41baa6442862b5ad7847d3ddf60d9ed50e55833 Mon Sep 17 00:00:00 2001 From: Paul Thomas Date: Thu, 1 Dec 2005 06:58:04 +0000 Subject: [PATCH] re PR fortran/24789 ([gfortran] ICE when assigning to array of strings) 2005-12-01 Paul Thomas PR fortran/24789 * trans-decl.c (gfc_get_symbol_decl): Move the expression for unit size of automatic character length, dummy pointer array elements down a few lines from the version that fixed PR15809. 2005-12-01 Paul Thomas PR fortran/24789 * gfortran.dg/auto_char_dummy_array_2.f90: New test. From-SVN: r107805 --- gcc/fortran/ChangeLog | 7 +++++ gcc/fortran/trans-decl.c | 31 +++++++++---------- gcc/testsuite/ChangeLog | 5 +++ .../gfortran.dg/auto_char_dummy_array_2.f90 | 11 +++++++ 4 files changed, 38 insertions(+), 16 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/auto_char_dummy_array_2.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index f787fb76e57..f9fd567e785 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2005-12-01 Paul Thomas + + PR fortran/24789 + * trans-decl.c (gfc_get_symbol_decl): Move the expression for + unit size of automatic character length, dummy pointer array + elements down a few lines from the version that fixed PR15809. + 2005-11-30 Bernhard Fischer PR fortran/21302 diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 63320ae6dd4..ea127d090f8 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -847,25 +847,24 @@ gfc_get_symbol_decl (gfc_symbol * sym) if (TREE_CODE (length) != INTEGER_CST) { gfc_finish_var_decl (length, sym); - - /* Set the element size of automatic character length - length, dummy, pointer arrays. */ - if (sym->attr.pointer && sym->attr.dummy - && sym->attr.dimension) - { - tmp = gfc_build_indirect_ref (sym->backend_decl); - etype = gfc_get_element_type (TREE_TYPE (tmp)); - if (TYPE_SIZE_UNIT (etype) == NULL_TREE) - { - tmp = TYPE_SIZE_UNIT (gfc_character1_type_node); - tmp = fold_convert (TREE_TYPE (tmp), length); - TYPE_SIZE_UNIT (etype) = tmp; - } - } - gfc_defer_symbol_init (sym); } } + + /* Set the element size of automatic and assumed character length + length, dummy, pointer arrays. */ + if (sym->attr.pointer && sym->attr.dummy + && sym->attr.dimension) + { + tmp = gfc_build_indirect_ref (sym->backend_decl); + etype = gfc_get_element_type (TREE_TYPE (tmp)); + if (TYPE_SIZE_UNIT (etype) == NULL_TREE) + { + tmp = TYPE_SIZE_UNIT (gfc_character1_type_node); + tmp = fold_convert (TREE_TYPE (tmp), sym->ts.cl->backend_decl); + TYPE_SIZE_UNIT (etype) = tmp; + } + } } /* Use a copy of the descriptor for dummy arrays. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d55401dd796..d0d6b5283f8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-12-01 Paul Thomas + + PR fortran/24789 + * gfortran.dg/auto_char_dummy_array_2.f90: New test. + 2005-12-01 Uros Bizjak PR target/24475 diff --git a/gcc/testsuite/gfortran.dg/auto_char_dummy_array_2.f90 b/gcc/testsuite/gfortran.dg/auto_char_dummy_array_2.f90 new file mode 100644 index 00000000000..666418301e5 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/auto_char_dummy_array_2.f90 @@ -0,0 +1,11 @@ +! { dg-do compile } +! Test fix for pr24789 - would segfault on the assignment +! because the array descriptor size was not set. +! +! This is the example submitted by Martin Reineke + +subroutine foo(vals) + character(len = *), pointer :: vals(:) + vals = '' +end subroutine + -- 2.30.2