From 86075aa5dd0b1ed3f6c9c67d0d3058c6c5c19d65 Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Mon, 27 Jan 2020 10:13:27 +0100 Subject: fortran] Fix PR 85781, ICE on valid PR fortran/85781 * trans-expr.c (gfc_conv_substring): Handle non-ARRAY_TYPE strings of Bind(C) procedures. PR fortran/85781 * gfortran.dg/bind_c_char_2.f90: New. * gfortran.dg/bind_c_char_3.f90: New. * gfortran.dg/bind_c_char_4.f90: New. * gfortran.dg/bind_c_char_5.f90: New. --- gcc/fortran/ChangeLog | 6 ++++++ gcc/fortran/trans-expr.c | 8 ++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) (limited to 'gcc/fortran') diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index ceefdf8..bfc3b22 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2020-01-27 Tobias Burnus + + PR fortran/85781 + * trans-expr.c (gfc_conv_substring): Handle non-ARRAY_TYPE strings + of Bind(C) procedures. + 2020-01-22 Jakub Jelinek * parse.c (parse_omp_structured_block): Handle ST_OMP_TARGET_PARALLEL. diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index e1c0fb2..5825a4b 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -2334,8 +2334,12 @@ gfc_conv_substring (gfc_se * se, gfc_ref * ref, int kind, else tmp = build_fold_indirect_ref_loc (input_location, se->expr); - tmp = gfc_build_array_ref (tmp, start.expr, NULL); - se->expr = gfc_build_addr_expr (type, tmp); + /* For BIND(C), a BT_CHARACTER is not an ARRAY_TYPE. */ + if (TREE_CODE (TREE_TYPE (tmp)) == ARRAY_TYPE) + { + tmp = gfc_build_array_ref (tmp, start.expr, NULL); + se->expr = gfc_build_addr_expr (type, tmp); + } } /* Length = end + 1 - start. */ -- cgit v1.1