]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR fortran/90561 (ICE in gimplify_var_or_parm_decl, at gimplify.c:2747)
authorThomas Koenig <tkoenig@gcc.gnu.org>
Tue, 13 Aug 2019 20:01:43 +0000 (20:01 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Tue, 13 Aug 2019 20:01:43 +0000 (20:01 +0000)
2019-08-13  Thomas Koenig  <tkoenig@gcc.gnu.org>

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  <tkoenig@gcc.gnu.org>

Backport from trunk
PR fortran/90561
* gfortran.dg/deferred_character_34.f90: New test.

From-SVN: r274398

gcc/fortran/ChangeLog
gcc/fortran/trans-expr.c
gcc/fortran/trans.c
gcc/fortran/trans.h
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/deferred_character_34.f90 [new file with mode: 0644]

index 0bacfee7f4237f9095bf607a0eccca2c9144a76b..f858e91754f6c1d04eefb0b025e9f7a3f10bee4a 100644 (file)
@@ -1,7 +1,15 @@
+2019-08-13  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       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  <kargl@gcc.gnu.org>
 
        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  <kargl@gcc.gnu.org>
index afe08fc266818049b53f2c4e266a3c9d4471d66e..4b8794b0f1e84819c500521e059df837d4347d59 100644 (file)
@@ -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
index e7844c9bf1f92fcd47630a553f4dc18ceb6d334a..167fcb2158c78da34a59a0ccec61b0a23a6336c6 100644 (file)
@@ -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:
index 273c75a422c071d65a2f19c35a3629243a8ede91..6b42d82806baf7c1ec4cc53b2b7d7062e344f3df 100644 (file)
@@ -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);
index ad4ea180fb255c4aca10835aa692a5d0be9533e5..a68c73e92428ee86c86dfea3d75ca076bbf5deb5 100644 (file)
@@ -1,3 +1,9 @@
+2019-08-13  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       Backport from trunk
+       PR fortran/90561
+       * gfortran.dg/deferred_character_34.f90: New test.
+
 2019-08-13  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        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 (file)
index 0000000..2040841
--- /dev/null
@@ -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