Hello world, this patch fixes a 9/10 regression by placing the variable used to hold a string length at function scope.
I chose to implement this version of gfc_evaluate_now as a separate function because I have a sneaking suspicion this may not be the last time we are going to encounter something like that - better have the function there for future use. Regression-tested. OK for trunk and gcc-9? Regards Thomas
Index: trans.h =================================================================== --- trans.h (Revision 274370) +++ trans.h (Arbeitskopie) @@ -507,6 +507,7 @@ void gfc_conv_label_variable (gfc_se * se, gfc_exp /* If the value is not constant, Create a temporary and copy the value. */ tree gfc_evaluate_now_loc (location_t, tree, stmtblock_t *); tree gfc_evaluate_now (tree, stmtblock_t *); +tree gfc_evaluate_now_function_scope (tree, stmtblock_t *); /* Find the appropriate variant of a math intrinsic. */ tree gfc_builtin_decl_for_float_kind (enum built_in_function, int); Index: trans.c =================================================================== --- trans.c (Revision 274370) +++ trans.c (Arbeitskopie) @@ -118,7 +118,20 @@ gfc_evaluate_now (tree expr, stmtblock_t * pblock) return gfc_evaluate_now_loc (input_location, expr, pblock); } +/* Like gfc_evaluate_now, but add the created variable to the + function scope. */ +tree +gfc_evaluate_now_function_scope (tree expr, stmtblock_t * pblock) +{ + tree var; + var = gfc_create_var_np (TREE_TYPE (expr), NULL); + gfc_add_decl_to_function (var); + gfc_add_modify (pblock, var, expr); + + return var; +} + /* Build a MODIFY_EXPR node and add it to a given statement block PBLOCK. A MODIFY_EXPR is an assignment: LHS <- RHS. */ Index: trans-expr.c =================================================================== --- trans-expr.c (Revision 274370) +++ trans-expr.c (Arbeitskopie) @@ -10796,7 +10796,8 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr if (expr1->ts.deferred && gfc_expr_attr (expr1).allocatable && gfc_check_dependency (expr1, expr2, true)) - rse.string_length = gfc_evaluate_now (rse.string_length, &rse.pre); + rse.string_length = + gfc_evaluate_now_function_scope (rse.string_length, &rse.pre); string_length = rse.string_length; } else
! { dg-do run } ! PR fortran/90561 ! This used to ICE. ! Original test case by Gerhard Steinmetz. program p character(:), allocatable :: z(:) z = [character(2):: 'ab', 'xy'] z = z(2) if (any(z /= 'xy')) stop 1 end