[gcc(refs/users/mikael/heads/refactor_descriptor_v291.01)] Renseignement token dans gcf_set_descriptor_from_scalar
Mikael Morin via Gcc-cvs <[email protected]>
| Newsgroups | gmane.comp.gcc.cvs |
|---|---|
| Message-ID | <[email protected]> |
https://gcc.gnu.org/g:d7dccf069d77ff1973a4b20ed02d3586f56f9e20 commit d7dccf069d77ff1973a4b20ed02d3586f56f9e20 Author: Mikael Morin <[email protected]> Date: Wed Jul 23 09:44:49 2025 +0200 Renseignement token dans gcf_set_descriptor_from_scalar Correction renseignement token Diff: --- gcc/fortran/trans-descriptor.cc | 10 ++++++---- gcc/fortran/trans-descriptor.h | 2 +- gcc/fortran/trans-expr.cc | 16 +++++++++++----- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc index 7ae111639549..0b5372e5eecf 100644 --- a/gcc/fortran/trans-descriptor.cc +++ b/gcc/fortran/trans-descriptor.cc @@ -1063,11 +1063,13 @@ gfc_copy_coarray_desc_part (stmtblock_t *block, tree dest, tree src) void gfc_set_descriptor_from_scalar (stmtblock_t *block, tree descr, tree scalar, gfc_expr *scalar_expr, - tree cond_presence) + tree cond_presence, tree caf_token) { - tree type; - type = gfc_get_scalar_to_descriptor_type (TREE_TYPE (scalar), - gfc_expr_attr (scalar_expr)); + if (flag_coarray == GFC_FCOARRAY_LIB && caf_token) + gfc_conv_descriptor_token_set (block, descr, caf_token); + + tree type = gfc_get_scalar_to_descriptor_type (TREE_TYPE (scalar), + gfc_expr_attr (scalar_expr)); gfc_conv_descriptor_dtype_set (block, descr, gfc_get_dtype (type)); gfc_copy_coarray_desc_part (block, descr, scalar); diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h index 96c9a9b57383..7125661a67f7 100644 --- a/gcc/fortran/trans-descriptor.h +++ b/gcc/fortran/trans-descriptor.h @@ -90,6 +90,6 @@ void gfc_copy_coarray_desc_part (stmtblock_t *, tree, tree); void gfc_set_descriptor_from_scalar_class (stmtblock_t *, tree, tree, gfc_expr *); void gfc_set_descriptor_from_scalar (stmtblock_t *, tree, tree); void gfc_set_descriptor_from_scalar (stmtblock_t *, tree, tree, gfc_expr *, - tree); + tree, tree); #endif /* GFC_TRANS_DESCRIPTOR_H */ diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc index be7913ff2adf..ca39247fdb20 100644 --- a/gcc/fortran/trans-expr.cc +++ b/gcc/fortran/trans-expr.cc @@ -809,6 +809,7 @@ gfc_conv_derived_to_class (gfc_se *parmse, gfc_expr *e, gfc_symbol *fsym, tree var; tree tmp; tree packed = NULL_TREE; + tree caf_token = NULL_TREE; /* The derived type needs to be converted to a temporary CLASS object. */ tmp = gfc_typenode_for_spec (&fsym->ts); @@ -825,12 +826,17 @@ gfc_conv_derived_to_class (gfc_se *parmse, gfc_expr *e, gfc_symbol *fsym, if (flag_coarray == GFC_FCOARRAY_LIB && CLASS_DATA (fsym)->attr.codimension) { - tree token; tmp = gfc_get_tree_for_caf_expr (e); if (POINTER_TYPE_P (TREE_TYPE (tmp))) tmp = build_fold_indirect_ref (tmp); - gfc_get_caf_token_offset (parmse, &token, nullptr, tmp, NULL_TREE, e); - gfc_conv_descriptor_token_set (&parmse->pre, ctree, token); + gfc_get_caf_token_offset (parmse, &caf_token, nullptr, tmp, NULL_TREE, e); + /* Update the token here, unless it's done elsewhere like in + gfc_set_descriptor_from_scalar. */ + if ((parmse->expr && POINTER_TYPE_P (TREE_TYPE (parmse->expr))) + || (parmse->ss && parmse->ss->info && parmse->ss->info->useflags) + || e->rank != 0 + || fsym->ts.u.derived->components->as == nullptr) + gfc_conv_descriptor_token_set (&parmse->pre, ctree, caf_token); } if (optional) @@ -896,8 +902,8 @@ gfc_conv_derived_to_class (gfc_se *parmse, gfc_expr *e, gfc_symbol *fsym, /* Scalar to an assumed-rank array. */ if (fsym->ts.u.derived->components->as) - gfc_set_descriptor_from_scalar (&parmse->pre, ctree, - parmse->expr, e, cond_optional); + gfc_set_descriptor_from_scalar (&parmse->pre, ctree, parmse->expr, + e, cond_optional, caf_token); else { tmp = fold_convert (TREE_TYPE (ctree), parmse->expr);