From 4e227341f6e6c3ceef721d3839c8d9eb6292db70 Mon Sep 17 00:00:00 2001 From: Paul Thomas Date: Fri, 31 Aug 2018 06:51:31 +0000 Subject: re PR fortran/86328 (Runtime segfault reading an allocatable class(*) object in allocate statements) 2018-08-31 Paul Thomas PR fortran/86328 PR fortran/86760 * trans-array.c (gfc_conv_scalarized_array_ref): Do not fix info->descriptor but pass it directly to gfc_build_array_ref. (gfc_conv_array_ref): Likewise for se->expr. * trans.c (gfc_build_array_ref): If 'decl' is a COMPONENT_REF obtain the span field directly from it. 2018-08-31 Paul Thomas PR fortran/86328 PR fortran/86760 * gfortran.dg/pr86328.f90 : New test. in comment 12 of the PR. * gfortran.dg/pr86760.f90 : New test. From-SVN: r264008 --- gcc/fortran/ChangeLog | 10 ++++++++++ gcc/fortran/trans-array.c | 12 ++---------- gcc/fortran/trans.c | 7 ++++++- 3 files changed, 18 insertions(+), 11 deletions(-) (limited to 'gcc/fortran') diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 0459843..c386a64 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,13 @@ +2018-08-31 Paul Thomas + + PR fortran/86328 + PR fortran/86760 + * trans-array.c (gfc_conv_scalarized_array_ref): Do not fix + info->descriptor but pass it directly to gfc_build_array_ref. + (gfc_conv_array_ref): Likewise for se->expr. + * trans.c (gfc_build_array_ref): If 'decl' is a COMPONENT_REF + obtain the span field directly from it. + 2017-08-28 Paul Thomas PR fortran/80477 diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 8133794..adb2c05 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -3414,11 +3414,7 @@ gfc_conv_scalarized_array_ref (gfc_se * se, gfc_array_ref * ar) if (is_pointer_array (info->descriptor)) { if (TREE_CODE (info->descriptor) == COMPONENT_REF) - { - decl = gfc_evaluate_now (info->descriptor, &se->pre); - GFC_DECL_PTR_ARRAY_P (decl) = 1; - TREE_USED (decl) = 1; - } + decl = info->descriptor; else if (TREE_CODE (info->descriptor) == INDIRECT_REF) decl = TREE_OPERAND (info->descriptor, 0); @@ -3659,11 +3655,7 @@ gfc_conv_array_ref (gfc_se * se, gfc_array_ref * ar, gfc_expr *expr, && is_pointer_array (se->expr)) { if (TREE_CODE (se->expr) == COMPONENT_REF) - { - decl = gfc_evaluate_now (se->expr, &se->pre); - GFC_DECL_PTR_ARRAY_P (decl) = 1; - TREE_USED (decl) = 1; - } + decl = se->expr; else if (TREE_CODE (se->expr) == INDIRECT_REF) decl = TREE_OPERAND (se->expr, 0); else diff --git a/gcc/fortran/trans.c b/gcc/fortran/trans.c index aa10fbb..153bab6 100644 --- a/gcc/fortran/trans.c +++ b/gcc/fortran/trans.c @@ -407,7 +407,12 @@ gfc_build_array_ref (tree base, tree offset, tree decl, tree vptr) if (vptr) span = gfc_vptr_size_get (vptr); else if (decl) - span = get_array_span (type, decl); + { + if (TREE_CODE (decl) == COMPONENT_REF) + span = gfc_conv_descriptor_span_get (decl); + else + span = get_array_span (type, decl); + } /* If a non-null span has been generated reference the element with pointer arithmetic. */ -- cgit v1.1