re PR fortran/78958 (Unallocated memory access after SOURCE-ALLOCATEing unlimited...
authorAndre Vehreschild <vehre@gcc.gnu.org>
Sun, 5 Feb 2017 12:42:31 +0000 (13:42 +0100)
committerAndre Vehreschild <vehre@gcc.gnu.org>
Sun, 5 Feb 2017 12:42:31 +0000 (13:42 +0100)
gcc/fortran/ChangeLog:

2017-02-05  Andre Vehreschild  <vehre@gcc.gnu.org>

PR fortran/78958
* trans-stmt.c (gfc_trans_allocate): Add the multiplying the _len
component of unlimited polymorphic objects when source-allocating.

From-SVN: r245192

gcc/fortran/ChangeLog
gcc/fortran/trans-stmt.c

index 63af2aeec6b700457e0b62f33f697efb06ab945d..601017dbfdd48d7030af38829bbf542a47d5ce43 100644 (file)
@@ -1,3 +1,9 @@
+2017-02-05  Andre Vehreschild  <vehre@gcc.gnu.org>
+
+       PR fortran/78958
+       * trans-stmt.c (gfc_trans_allocate): Add the multiplying the _len
+       component of unlimited polymorphic objects when source-allocating.
+
 2017-02-05  Andre Vehreschild  <vehre@gcc.gnu.org>
 
        PR fortran/79230
index ad4b7373a215b0506fce26bb239291b3806fda47..61e597f6a1f974f273f96f88325d16e0264f751b 100644 (file)
@@ -6009,14 +6009,21 @@ gfc_trans_allocate (gfc_code * code)
         needs to be provided, which is done most of the time by the
         pre-evaluation step.  */
       nelems = NULL_TREE;
-      if (expr3_len && code->expr3->ts.type == BT_CHARACTER)
-       /* When al is an array, then the element size for each element
-          in the array is needed, which is the product of the len and
-          esize for char arrays.  */
-       tmp = fold_build2_loc (input_location, MULT_EXPR,
-                              TREE_TYPE (expr3_esize), expr3_esize,
-                              fold_convert (TREE_TYPE (expr3_esize),
-                                            expr3_len));
+      if (expr3_len && (code->expr3->ts.type == BT_CHARACTER
+                       || code->expr3->ts.type == BT_CLASS))
+       {
+         /* When al is an array, then the element size for each element
+            in the array is needed, which is the product of the len and
+            esize for char arrays.  For unlimited polymorphics len can be
+            zero, therefore take the maximum of len and one.  */
+         tmp = fold_build2_loc (input_location, MAX_EXPR,
+                                TREE_TYPE (expr3_len),
+                                expr3_len, fold_convert (TREE_TYPE (expr3_len),
+                                                         integer_one_node));
+         tmp = fold_build2_loc (input_location, MULT_EXPR,
+                                TREE_TYPE (expr3_esize), expr3_esize,
+                                fold_convert (TREE_TYPE (expr3_esize), tmp));
+       }
       else
        tmp = expr3_esize;
       if (!gfc_array_allocate (&se, expr, stat, errmsg, errlen,