Message ID | CAGkQGiKnEw=JDONsj2booUX2psjP9i6C0fhNa_AFZwMEmF7xHQ@mail.gmail.com |
---|---|
State | New |
Headers | show |
Series | [fortran] PR99125 - [9/10/11 Regression] ICE: gimplification failed (gimplify.c:15068) | expand |
Hi Paul, On 24.02.21 15:05, Paul Richard Thomas via Fortran wrote: > This problem was caused by the compiler attempting to use 0 as an lvalue > and to assign 0 to it. I did recall the problem – and indeed: PR95868. The trans-array.c patch does effectively the same as mine there, some other use of 'tmp' but otherwise ... The trans-expr patch, I didn't have; unfortunately, it does not solve the other issues of my PR, either. (Thus, if you are interested in continuing the len=: work ...) [Once that PR is fixed, trans-openmp.c has to updated for it as well.] > Understandably, this upset the gimplifer quite a bit > :-) The fix is to use the ss_info string length for deferred length > character components, where the hidden string length component has been > used. The use of a constant as an lvalue is prevented by checking that the > expression string length is a variable. > > Regtests on FC33/x86_64 - OK for all three branches? LGTM. Thanks for the patch! Tobias > Fortran: Fix for class defined operators [PR99125]. > > 2021-02-23 Paul Thomas <pault@gcc.gnu.org> > > gcc/fortran > PR fortran/99125 > * trans-array.c (gfc_conv_expr_descriptor): For deferred length > length components use the ss_info string length instead of > gfc_get_expr_charlen. Make sure that the deferred string length > is a variable before assigning to it. Otherwise use the expr. > * trans-expr.c (gfc_conv_string_length): Make sure that the > deferred string length is a variable before assigning to it. > > gcc/testsuite/ > PR fortran/99125 > * gfortran.dg/alloc_deferred_comp_1.f90: New test. ----------------- Mentor Graphics (Deutschland) GmbH, Arnulfstrasse 201, 80634 München Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Frank Thürauf
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index c6725659093..e85d63c3539 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -7670,15 +7670,21 @@ gfc_conv_expr_descriptor (gfc_se *se, gfc_expr *expr) /* Set the string_length for a character array. */ if (expr->ts.type == BT_CHARACTER) { - se->string_length = gfc_get_expr_charlen (expr); + if (deferred_array_component) + se->string_length = ss_info->string_length; + else + se->string_length = gfc_get_expr_charlen (expr); + if (VAR_P (se->string_length) && expr->ts.u.cl->backend_decl == se->string_length) tmp = ss_info->string_length; else tmp = se->string_length; - if (expr->ts.deferred) + if (expr->ts.deferred && VAR_P (expr->ts.u.cl->backend_decl)) gfc_add_modify (&se->pre, expr->ts.u.cl->backend_decl, tmp); + else + expr->ts.u.cl->backend_decl = tmp; } /* If we have an array section, are assigning or passing an array diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index e61492485b8..9d178360fc3 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -2471,7 +2471,7 @@ gfc_conv_string_length (gfc_charlen * cl, gfc_expr * expr, stmtblock_t * pblock) se.expr, build_zero_cst (TREE_TYPE (se.expr))); gfc_add_block_to_block (pblock, &se.pre); - if (cl->backend_decl) + if (cl->backend_decl && VAR_P (cl->backend_decl)) gfc_add_modify (pblock, cl->backend_decl, se.expr); else cl->backend_decl = gfc_evaluate_now (se.expr, pblock);