diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2019-01-13 11:06:03 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2019-01-13 11:06:03 +0000 |
commit | 5f8865c358bed3c7f71329b429a617ad8150a042 (patch) | |
tree | 0a66079575ac33a1212be350cbd4d286af6fdfcd /gcc/fortran/trans-array.c | |
parent | 264201216816c9145e40b856628a6c3e3eec6178 (diff) | |
download | gcc-5f8865c358bed3c7f71329b429a617ad8150a042.zip gcc-5f8865c358bed3c7f71329b429a617ad8150a042.tar.gz gcc-5f8865c358bed3c7f71329b429a617ad8150a042.tar.bz2 |
re PR fortran/59345 (_gfortran_internal_pack on compiler generated temps)
2019-01-13 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/59345
* trans-array.c (gfc_conv_array_parameter): Remove TODO. Do not
pack/unpack results of functions which return an explicit-shaped
or allocatable array.
2019-01-13 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/59345
* gfortran.dg/internal_pack_17.f90: New test.
* gfortran.dg/alloc_comp_auto_array_3.f90: Adjust number of calls
to builtin_free.
From-SVN: r267903
Diffstat (limited to 'gcc/fortran/trans-array.c')
-rw-r--r-- | gcc/fortran/trans-array.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 6b3c0e2..ae597e8 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -7756,7 +7756,6 @@ array_parameter_size (tree desc, gfc_expr *expr, tree *size) } /* Convert an array for passing as an actual parameter. */ -/* TODO: Optimize passing g77 arrays. */ void gfc_conv_array_parameter (gfc_se * se, gfc_expr * expr, bool g77, @@ -7882,11 +7881,23 @@ gfc_conv_array_parameter (gfc_se * se, gfc_expr * expr, bool g77, no_pack = contiguous && no_pack; - /* If we have an expression, an array temporary will be - generated which does not need to be packed / unpacked - if passed to an explicit-shape dummy array. */ + /* If we have an EXPR_OP or a function returning an explicit-shaped + or allocatable array, an array temporary will be generated which + does not need to be packed / unpacked if passed to an + explicit-shape dummy array. */ - no_pack = no_pack || (g77 && expr->expr_type == EXPR_OP); + if (g77) + { + if (expr->expr_type == EXPR_OP) + no_pack = 1; + else if (expr->expr_type == EXPR_FUNCTION && expr->value.function.esym) + { + gfc_symbol *result = expr->value.function.esym->result; + if (result->attr.dimension + && (result->as->type == AS_EXPLICIT || result->attr.allocatable)) + no_pack = 1; + } + } /* Array constructors are always contiguous and do not need packing. */ array_constructor = g77 && !this_array_result && expr->expr_type == EXPR_ARRAY; |