From 1e43632dbdcafa057a24672f2af77c71d3a58479 Mon Sep 17 00:00:00 2001 From: Thomas Koenig Date: Tue, 13 Aug 2019 20:01:43 +0000 Subject: [PATCH] backport: re PR fortran/90561 (ICE in gimplify_var_or_parm_decl, at gimplify.c:2747) 2019-08-13 Thomas Koenig Backport from trunk PR fortran/90561 * trans.h (gfc_evaluate_now_function_scope): New function. * trans.c (gfc_evaluate_now_function_scope): New function. * trans-expr.c (gfc_trans_assignment): Use it. 2019-08-13 Thomas Koenig Backport from trunk PR fortran/90561 * gfortran.dg/deferred_character_34.f90: New test. From-SVN: r274398 --- gcc/fortran/ChangeLog | 10 +++++++++- gcc/fortran/trans-expr.c | 3 ++- gcc/fortran/trans.c | 13 +++++++++++++ gcc/fortran/trans.h | 1 + gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gfortran.dg/deferred_character_34.f90 | 10 ++++++++++ 6 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/deferred_character_34.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 0bacfee7f423..f858e91754f6 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,7 +1,15 @@ +2019-08-13 Thomas Koenig + + Backport from trunk + PR fortran/90561 + * trans.h (gfc_evaluate_now_function_scope): New function. + * trans.c (gfc_evaluate_now_function_scope): New function. + * trans-expr.c (gfc_trans_assignment): Use it. + 2019-08-13 Steven G. Kargl PR fortran/89647 - resolve.c (resolve_typebound_procedure): Allow host associated + resolve.c (resolve_typebound_procedure): Allow host associated procedure to be a binding target. While here, wrap long line. 2019-08-13 Steven G. Kargl diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index afe08fc26681..4b8794b0f1e8 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -10603,7 +10603,8 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag, 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 diff --git a/gcc/fortran/trans.c b/gcc/fortran/trans.c index e7844c9bf1f9..167fcb2158c7 100644 --- a/gcc/fortran/trans.c +++ b/gcc/fortran/trans.c @@ -118,6 +118,19 @@ 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: diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h index 273c75a422c0..6b42d82806ba 100644 --- a/gcc/fortran/trans.h +++ b/gcc/fortran/trans.h @@ -507,6 +507,7 @@ void gfc_conv_label_variable (gfc_se * se, gfc_expr * expr); /* 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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ad4ea180fb25..a68c73e92428 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2019-08-13 Thomas Koenig + + Backport from trunk + PR fortran/90561 + * gfortran.dg/deferred_character_34.f90: New test. + 2019-08-13 Steven G. Kargl PR fortran/89647 diff --git a/gcc/testsuite/gfortran.dg/deferred_character_34.f90 b/gcc/testsuite/gfortran.dg/deferred_character_34.f90 new file mode 100644 index 000000000000..204084128790 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/deferred_character_34.f90 @@ -0,0 +1,10 @@ +! { 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 -- 2.47.2