From 2fdd5f542612633bb7e9302ccae0fb014e4529ad Mon Sep 17 00:00:00 2001 From: Thomas Koenig Date: Sat, 24 Jan 2015 15:20:56 +0000 Subject: [PATCH] backport: re PR fortran/57023 (Not packing arrays with changing variable used for size) 2015-01-24 Thomas Koenig Backport from trunk PR fortran/57023 * dependency.c (callback_dummy_intent_not_int): New function. (dummy_intent_not_in): New function. (gfc_full_array_ref_p): Use dummy_intent_not_in. 2015-01-24 Thomas Koenig Backport from trunk PR fortran/57023 * gfortran.dg/internal_pack_15.f90: New test. From-SVN: r220082 --- gcc/fortran/ChangeLog | 8 ++++++++ gcc/fortran/dependency.c | 37 ++++++++++++++++++++++++++++++++++--- gcc/testsuite/ChangeLog | 6 ++++++ 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 18f4b3f1d3a2..646a68db592d 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2015-01-24 Thomas Koenig + + Backport from trunk + PR fortran/57023 + * dependency.c (callback_dummy_intent_not_int): New function. + (dummy_intent_not_in): New function. + (gfc_full_array_ref_p): Use dummy_intent_not_in. + 2015-01-12 Janus Weil Backport from mainline diff --git a/gcc/fortran/dependency.c b/gcc/fortran/dependency.c index 3924905f0eff..a40b891ffdf5 100644 --- a/gcc/fortran/dependency.c +++ b/gcc/fortran/dependency.c @@ -1604,11 +1604,40 @@ gfc_check_element_vs_element (gfc_ref *lref, gfc_ref *rref, int n) return GFC_DEP_EQUAL; } +/* Callback function for checking if an expression depends on a + dummy variable which is any other than INTENT(IN). */ + +static int +callback_dummy_intent_not_in (gfc_expr **ep, + int *walk_subtrees ATTRIBUTE_UNUSED, + void *data ATTRIBUTE_UNUSED) +{ + gfc_expr *e = *ep; + + if (e->expr_type == EXPR_VARIABLE && e->symtree + && e->symtree->n.sym->attr.dummy) + return e->symtree->n.sym->attr.intent != INTENT_IN; + else + return 0; +} + +/* Auxiliary function to check if subexpressions have dummy variables which + are not intent(in). +*/ + +static bool +dummy_intent_not_in (gfc_expr **ep) +{ + return gfc_expr_walker (ep, callback_dummy_intent_not_in, NULL); +} /* Determine if an array ref, usually an array section specifies the entire array. In addition, if the second, pointer argument is provided, the function will return true if the reference is - contiguous; eg. (:, 1) gives true but (1,:) gives false. */ + contiguous; eg. (:, 1) gives true but (1,:) gives false. + If one of the bounds depends on a dummy variable which is + not INTENT(IN), also return false, because the user may + have changed the variable. */ bool gfc_full_array_ref_p (gfc_ref *ref, bool *contiguous) @@ -1672,14 +1701,16 @@ gfc_full_array_ref_p (gfc_ref *ref, bool *contiguous) && (!ref->u.ar.as || !ref->u.ar.as->lower[i] || gfc_dep_compare_expr (ref->u.ar.start[i], - ref->u.ar.as->lower[i]))) + ref->u.ar.as->lower[i]) + || dummy_intent_not_in (&ref->u.ar.start[i]))) lbound_OK = false; /* Check the upper bound. */ if (ref->u.ar.end[i] && (!ref->u.ar.as || !ref->u.ar.as->upper[i] || gfc_dep_compare_expr (ref->u.ar.end[i], - ref->u.ar.as->upper[i]))) + ref->u.ar.as->upper[i]) + || dummy_intent_not_in (&ref->u.ar.end[i]))) ubound_OK = false; /* Check the stride. */ if (ref->u.ar.stride[i] diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fde23519a363..eda05176e06e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2015-01-24 Thomas Koenig + + Backport from trunk + PR fortran/57023 + * gfortran.dg/internal_pack_15.f90: New test. + 2015-01-20 Marek Polacek Backport from mainline -- 2.47.2