diff options
author | Mikael Morin <mikael@gcc.gnu.org> | 2016-02-05 21:41:15 +0000 |
---|---|---|
committer | Mikael Morin <mikael@gcc.gnu.org> | 2016-02-05 21:41:15 +0000 |
commit | 711d7c231fc6a5a04f65568cf17a47c270527a09 (patch) | |
tree | 6b50b567f3e7b484d1a22fbe37c2dcf74d0ad824 /gcc/fortran/trans-expr.c | |
parent | 861c7bcd62bcbbf6e14311e18ba7293cc581e1ff (diff) | |
download | gcc-711d7c231fc6a5a04f65568cf17a47c270527a09.zip gcc-711d7c231fc6a5a04f65568cf17a47c270527a09.tar.gz gcc-711d7c231fc6a5a04f65568cf17a47c270527a09.tar.bz2 |
Fix fortran scalar elemental dependency mishandling
PR fortran/66089
gcc/fortran/
* trans-expr.c (expr_is_variable, gfc_expr_is_variable): Rename
the former to the latter and make it non-static. Update callers.
* gfortran.h (gfc_expr_is_variable): New declaration.
(struct gfc_ss_info): Add field needs_temporary.
* trans-array.c (gfc_scalar_elemental_arg_saved_as_argument):
Tighten the condition on aggregate expressions with a check
that the expression is a variable and doesn't need a temporary.
(gfc_conv_resolve_dependency): Add intermediary reference variable.
Set the needs_temporary field.
gcc/testsuite/
* gfortran.dg/elemental_dependency_6.f90: New.
From-SVN: r233188
Diffstat (limited to 'gcc/fortran/trans-expr.c')
-rw-r--r-- | gcc/fortran/trans-expr.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 87af7ac..4baadc8 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -8834,8 +8834,8 @@ gfc_trans_array_constructor_copy (gfc_expr * expr1, gfc_expr * expr2) /* Tells whether the expression is to be treated as a variable reference. */ -static bool -expr_is_variable (gfc_expr *expr) +bool +gfc_expr_is_variable (gfc_expr *expr) { gfc_expr *arg; gfc_component *comp; @@ -8848,7 +8848,7 @@ expr_is_variable (gfc_expr *expr) if (arg) { gcc_assert (expr->value.function.isym->id == GFC_ISYM_TRANSPOSE); - return expr_is_variable (arg); + return gfc_expr_is_variable (arg); } /* A data-pointer-returning function should be considered as a variable @@ -9329,7 +9329,7 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag, must have its components deallocated afterwards. */ scalar_to_array = (expr2->ts.type == BT_DERIVED && expr2->ts.u.derived->attr.alloc_comp - && !expr_is_variable (expr2) + && !gfc_expr_is_variable (expr2) && expr1->rank && !expr2->rank); scalar_to_array |= (expr1->ts.type == BT_DERIVED && expr1->rank @@ -9373,7 +9373,7 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag, } tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts, - expr_is_variable (expr2) || scalar_to_array + gfc_expr_is_variable (expr2) || scalar_to_array || expr2->expr_type == EXPR_ARRAY, !(l_is_temp || init_flag) && dealloc); gfc_add_expr_to_block (&body, tmp); |