aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/trans-expr.c
diff options
context:
space:
mode:
authorTobias Burnus <tobias@codesourcery.com>2020-01-27 10:13:27 +0100
committerTobias Burnus <tobias@codesourcery.com>2020-01-27 10:13:27 +0100
commit86075aa5dd0b1ed3f6c9c67d0d3058c6c5c19d65 (patch)
tree3a4df3f42a59eb04ea8504112bfe74248e68c562 /gcc/fortran/trans-expr.c
parent40bf3f1fd058028988b2625f89efe6bb811a4185 (diff)
downloadgcc-86075aa5dd0b1ed3f6c9c67d0d3058c6c5c19d65.zip
gcc-86075aa5dd0b1ed3f6c9c67d0d3058c6c5c19d65.tar.gz
gcc-86075aa5dd0b1ed3f6c9c67d0d3058c6c5c19d65.tar.bz2
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.
Diffstat (limited to 'gcc/fortran/trans-expr.c')
-rw-r--r--gcc/fortran/trans-expr.c8
1 files changed, 6 insertions, 2 deletions
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. */