aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2023-05-23 06:46:37 +0100
committerPaul Thomas <pault@gcc.gnu.org>2023-05-23 06:46:37 +0100
commit842a432b02238361ecc601d301ac400a7f30f4fa (patch)
tree1c5acd09c06ecd60a04d9dbc33bede0cff92a714 /gcc
parent056280dea422ba831e40dee9e6769862927998c6 (diff)
downloadgcc-842a432b02238361ecc601d301ac400a7f30f4fa.zip
gcc-842a432b02238361ecc601d301ac400a7f30f4fa.tar.gz
gcc-842a432b02238361ecc601d301ac400a7f30f4fa.tar.bz2
Fortran: Fix assumed length chars and len inquiry [PR103716]
2023-05-23 Paul Thomas <pault@gcc.gnu.org> gcc/fortran PR fortran/103716 * resolve.cc (gfc_resolve_ref): Conversion of array_ref into an element should be done for all characters without a len expr, not just deferred lens, and for integer expressions. * trans-expr.cc (conv_inquiry): For len and kind inquiry refs, set the se string_length to NULL_TREE. gcc/testsuite/ PR fortran/103716 * gfortran.dg/pr103716.f90 : New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/resolve.cc4
-rw-r--r--gcc/fortran/trans-expr.cc2
-rw-r--r--gcc/testsuite/gfortran.dg/pr103716.f9015
3 files changed, 20 insertions, 1 deletions
diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc
index 5f1fc96..83e45f1 100644
--- a/gcc/fortran/resolve.cc
+++ b/gcc/fortran/resolve.cc
@@ -5526,7 +5526,9 @@ gfc_resolve_ref (gfc_expr *expr)
case REF_INQUIRY:
/* Implement requirement in note 9.7 of F2018 that the result of the
LEN inquiry be a scalar. */
- if (ref->u.i == INQUIRY_LEN && array_ref && expr->ts.deferred)
+ if (ref->u.i == INQUIRY_LEN && array_ref
+ && ((expr->ts.type == BT_CHARACTER && !expr->ts.u.cl->length)
+ || expr->ts.type == BT_INTEGER))
{
array_ref->u.ar.type = AR_ELEMENT;
expr->rank = 0;
diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index 6138921..45a984b 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -2862,11 +2862,13 @@ conv_inquiry (gfc_se * se, gfc_ref * ref, gfc_expr *expr, gfc_typespec *ts)
case INQUIRY_KIND:
res = build_int_cst (gfc_typenode_for_spec (&expr->ts),
ts->kind);
+ se->string_length = NULL_TREE;
break;
case INQUIRY_LEN:
res = fold_convert (gfc_typenode_for_spec (&expr->ts),
se->string_length);
+ se->string_length = NULL_TREE;
break;
default:
diff --git a/gcc/testsuite/gfortran.dg/pr103716.f90 b/gcc/testsuite/gfortran.dg/pr103716.f90
new file mode 100644
index 0000000..4f78900
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr103716.f90
@@ -0,0 +1,15 @@
+! { dg-do compile }
+!
+! The gimplifier used to throw a fit on thes two functions.
+!
+! Contributed by Gerhard Steinmetz <gscfq@t-online.de>
+!
+function f1(x)
+ character(*) :: x(*)
+ print *, g(x%len)
+end
+
+function f2(x)
+ character(*) :: x(3)
+ print *, g(x%len)
+end