re PR fortran/72698 (ICE in lhd_incomplete_type_error, at langhooks.c:205)
authorAndre Vehreschild <vehre@gcc.gnu.org>
Mon, 8 Aug 2016 09:49:37 +0000 (11:49 +0200)
committerAndre Vehreschild <vehre@gcc.gnu.org>
Mon, 8 Aug 2016 09:49:37 +0000 (11:49 +0200)
gcc/testsuite/ChangeLog:

2016-08-08  Andre Vehreschild  <vehre@gcc.gnu.org>

PR fortran/72698
* gfortran.dg/allocate_with_source_20.f03: New test.

gcc/fortran/ChangeLog:

2016-08-08  Andre Vehreschild  <vehre@gcc.gnu.org>

PR fortran/72698
* trans-stmt.c (gfc_trans_allocate): Prevent generating code for
copy of zero sized string and with it an ICE.

From-SVN: r239236

gcc/fortran/ChangeLog
gcc/fortran/trans-stmt.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/allocate_with_source_20.f03 [new file with mode: 0644]

index bf5ec12c49c49fcb546a8b3ab5ebf2b559c32f1f..3b54ee38c7ede27cda7060def953bcc57c6b0004 100644 (file)
@@ -1,3 +1,9 @@
+2016-08-08  Andre Vehreschild  <vehre@gcc.gnu.org>
+
+       PR fortran/72698
+       * trans-stmt.c (gfc_trans_allocate): Prevent generating code for
+       copy of zero sized string and with it an ICE.
+
 2016-08-08  Andre Vehreschild  <vehre@gcc.gnu.org>
 
        PR fortran/70524
index 6e4e2a79029b26ce39533e324edd7dd3dc348c32..5884e7a4e24358ec1124f5728b085e18cf488f08 100644 (file)
@@ -5448,9 +5448,19 @@ gfc_trans_allocate (gfc_code * code)
        }
       gfc_add_block_to_block (&block, &se.pre);
       gfc_add_block_to_block (&post, &se.post);
+
+      /* Special case when string in expr3 is zero.  */
+      if (code->expr3->ts.type == BT_CHARACTER
+         && integer_zerop (se.string_length))
+       {
+         gfc_init_se (&se, NULL);
+         temp_var_needed = false;
+         expr3_len = integer_zero_node;
+         e3_is = E3_MOLD;
+       }
       /* Prevent aliasing, i.e., se.expr may be already a
             variable declaration.  */
-      if (se.expr != NULL_TREE && temp_var_needed)
+      else if (se.expr != NULL_TREE && temp_var_needed)
        {
          tree var, desc;
          tmp = GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (se.expr)) || is_coarray ?
@@ -5679,11 +5689,8 @@ gfc_trans_allocate (gfc_code * code)
       gcc_assert (expr3_esize);
       expr3_esize = fold_convert (sizetype, expr3_esize);
       if (e3_is == E3_MOLD)
-       {
-         /* The expr3 is no longer valid after this point.  */
-         expr3 = NULL_TREE;
-         e3_is = E3_UNSET;
-       }
+       /* The expr3 is no longer valid after this point.  */
+       expr3 = NULL_TREE;
     }
   else if (code->ext.alloc.ts.type != BT_UNKNOWN)
     {
@@ -6012,7 +6019,7 @@ gfc_trans_allocate (gfc_code * code)
                            fold_convert (TREE_TYPE (al_len),
                                          integer_zero_node));
        }
-      if (code->expr3 && !code->expr3->mold)
+      if (code->expr3 && !code->expr3->mold && e3_is != E3_MOLD)
        {
          /* Initialization via SOURCE block (or static default initializer).
             Classes need some special handling, so catch them first.  */
index c7a11282a998f89b71a2e6e3678dc7cceea3f90a..6b7135cfecaad05cef842fb0593f1b83a410637b 100644 (file)
@@ -1,3 +1,8 @@
+2016-08-08  Andre Vehreschild  <vehre@gcc.gnu.org>
+
+       PR fortran/72698
+       * gfortran.dg/allocate_with_source_20.f03: New test.
+
 2016-08-08  Alan Modra  <amodra@gmail.com>
 
        * gcc.c-torture/compile/pr72802.c: New.
diff --git a/gcc/testsuite/gfortran.dg/allocate_with_source_20.f03 b/gcc/testsuite/gfortran.dg/allocate_with_source_20.f03
new file mode 100644 (file)
index 0000000..67b50ec
--- /dev/null
@@ -0,0 +1,21 @@
+! { dg-do run }
+
+! Check that PR72698 is fixed.
+! Contributed by Gerhard Steinmetz
+
+module m
+contains
+   integer function f()
+      f = 4
+   end
+end
+program p
+   use m
+   character(3), parameter :: c = 'abc'
+   character(:), allocatable :: z
+   allocate (z, source=repeat(c(2:1), f()))
+   if (len(z) /= 0) call abort()
+   if (z /= "") call abort()
+end
+
+