Fortran : ICE in gfc_trans_label_assign PR50392
authorMark Eggleston <markeggleston@gcc.gnu.org>
Thu, 7 May 2020 07:15:26 +0000 (08:15 +0100)
committerMark Eggleston <markeggleston@gcc.gnu.org>
Wed, 27 May 2020 14:46:23 +0000 (15:46 +0100)
A function may contain an assigned goto.  If the the return variable
is an integer a statement can be assigned to it.  Prior to this fix
this resulted in an ICE.

2020-05-27  Tobias Burnus  <tobias@codesourcery.com>

gcc/fortran/

PR fortran/50392
* trans-decl.c (gfc_get_symbol_decl): Remove unnecessary block
delimiters.  Add auxiliary variables if a label is assigned to
a return variable. (gfc_gat_fake_result): If the symbol has an
assign attribute set declaration from the symbol's backend
declaration.

2020-05-27  Mark Eggleston  <markeggleston@gnu.gcc.org>

gcc/testsuite/

PR fortran/50392
* gfortran.dg/pr50392.f: New test.

gcc/fortran/trans-decl.c
gcc/testsuite/gfortran.dg/pr50392.f [new file with mode: 0644]

index 487e776f5dd37077221bdf3ac20406928f5ef8ed..e10122e6e0cf90f98c55d04314090fdd690af6f8 100644 (file)
@@ -1682,9 +1682,7 @@ gfc_get_symbol_decl (gfc_symbol * sym)
 
       TREE_USED (sym->backend_decl) = 1;
       if (sym->attr.assign && GFC_DECL_ASSIGN (sym->backend_decl) == 0)
-       {
-         gfc_add_assign_aux_vars (sym);
-       }
+       gfc_add_assign_aux_vars (sym);
 
       if (sym->ts.type == BT_CLASS && sym->backend_decl)
        GFC_DECL_CLASS(sym->backend_decl) = 1;
@@ -1692,6 +1690,10 @@ gfc_get_symbol_decl (gfc_symbol * sym)
      return sym->backend_decl;
     }
 
+  if (sym->result == sym && sym->attr.assign
+      && GFC_DECL_ASSIGN (sym->backend_decl) == 0)
+    gfc_add_assign_aux_vars (sym);
+
   if (sym->backend_decl)
     return sym->backend_decl;
 
@@ -3196,6 +3198,9 @@ gfc_get_fake_result_decl (gfc_symbol * sym, int parent_flag)
   else
     current_fake_result_decl = build_tree_list (NULL, decl);
 
+  if (sym->attr.assign)
+    DECL_LANG_SPECIFIC (decl) = DECL_LANG_SPECIFIC (sym->backend_decl);
+
   return decl;
 }
 
diff --git a/gcc/testsuite/gfortran.dg/pr50392.f b/gcc/testsuite/gfortran.dg/pr50392.f
new file mode 100644 (file)
index 0000000..2cb883e
--- /dev/null
@@ -0,0 +1,12 @@
+! { dg-do compile }
+! 
+      function kf()
+      integer kf
+      assign 1 to kf ! { dg-warning "Deleted feature: ASSIGN statement at" }
+      kf = 2
+      goto kf ! { dg-warning "Deleted feature: Assigned GOTO statement at" }
+      kf = 1
+ 1    continue
+      kf = 0
+      end
+