From 47b92d22d3aea04ce6a936c768953dd0406f41c2 Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Fri, 12 Oct 2018 20:18:13 +0200 Subject: Fix off-by-one issue with inline matmul PR fortran/87597 * expr.c (gfc_simplify_expr): Avoid simplifying the 'array' argument to lbound/ubound/lcobound/ ucobound. PR fortran/87597 * gfortran.dg/inline_matmul_24.f90: New. From-SVN: r265126 --- gcc/fortran/ChangeLog | 7 +++++++ gcc/fortran/expr.c | 15 ++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) (limited to 'gcc/fortran') diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 2181363..4ee065a 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2018-10-12 Tobias Burnus + + PR fortran/87597 + * expr.c (gfc_simplify_expr): Avoid simplifying + the 'array' argument to lbound/ubound/lcobound/ + ucobound. + 2018-10-12 Tobias Burnus PR fortran/58787 diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index 1cfda5f..ca6f95d 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -1937,7 +1937,20 @@ gfc_simplify_expr (gfc_expr *p, int type) break; case EXPR_FUNCTION: - for (ap = p->value.function.actual; ap; ap = ap->next) + // For array-bound functions, we don't need to optimize + // the 'array' argument. In particular, if the argument + // is a PARAMETER, simplifying might convert an EXPR_VARIABLE + // into an EXPR_ARRAY; the latter has lbound = 1, the former + // can have any lbound. + ap = p->value.function.actual; + if (p->value.function.isym && + (p->value.function.isym->id == GFC_ISYM_LBOUND + || p->value.function.isym->id == GFC_ISYM_UBOUND + || p->value.function.isym->id == GFC_ISYM_LCOBOUND + || p->value.function.isym->id == GFC_ISYM_UCOBOUND)) + ap = ap->next; + + for ( ; ap; ap = ap->next) if (!gfc_simplify_expr (ap->expr, type)) return false; -- cgit v1.1