re PR fortran/67564 (Segfault on sourced allocattion statement with class(*) arrays)
authorPaul Thomas <pault@gcc.gnu.org>
Sat, 5 Nov 2016 07:11:24 +0000 (07:11 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Sat, 5 Nov 2016 07:11:24 +0000 (07:11 +0000)
2016-11-05  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/67564
* trans-expr.c (gfc_conv_class_to_class): Return _len component
of unlimited polymorphic entities.

2016-11-05  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/67564
* gfortran.dg/select_type_39.f03: New test.

From-SVN: r241869

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

index f6b739c84eb2b50b18743ae10711ab8fecd68523..bf85619bcc983cedd3d99641c1f8e0b0e6d39f52 100644 (file)
@@ -1,4 +1,10 @@
-2016-04-19  Paul Thomas  <pault@gcc.gnu.org>
+2016-11-05  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/67564
+       * trans-expr.c (gfc_conv_class_to_class): Return _len component
+       of unlimited polymorphic entities.
+
+2016-11-04  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/64933
        * primary.c (gfc_match_varspec): If selector expression is
index 7159b172eead2c00b35c20453be5696853841ae7..309f5023ab4804a37f62102c7c48eb1eb6740e15 100644 (file)
@@ -1091,6 +1091,12 @@ gfc_conv_class_to_class (gfc_se *parmse, gfc_expr *e, gfc_typespec class_ts,
        tmp = integer_zero_node;
       gfc_add_modify (&parmse->pre, ctree,
                      fold_convert (TREE_TYPE (ctree), tmp));
+
+      /* Return the len component, except in the case of scalarized array
+       references, where the dynamic type cannot change.  */
+      if (!elemental && full_array && copyback)
+         gfc_add_modify (&parmse->post, tmp,
+                         fold_convert (TREE_TYPE (tmp), ctree));
     }
 
   if (optional)
index 3babf14777b021954986da4724588a6794207020..4369222f1d4398d6b23818ed1de6394a2c42a233 100644 (file)
@@ -1,4 +1,9 @@
-2016-04-19  Paul Thomas  <pault@gcc.gnu.org>
+2016-11-05  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/67564
+       * gfortran.dg/select_type_39.f03: New test.
+
+2016-11-04  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/64933
        * gfortran.dg/associate_23.f90: New test.
diff --git a/gcc/testsuite/gfortran.dg/select_type_39.f03 b/gcc/testsuite/gfortran.dg/select_type_39.f03
new file mode 100644 (file)
index 0000000..08d6195
--- /dev/null
@@ -0,0 +1,20 @@
+! { dg-do run }
+!
+! Tests the fix for PR67564 comment #9.
+!
+! Contributed by Neil Carlson  <neil.n.carlson@gmail.com>
+!
+class(*), allocatable :: val(:)
+call get_value (val)
+select type (val)
+type is (character(*))
+  if (size (val) .ne. 2) call abort
+  if (len(val) .ne. 3) call abort
+  if (any (val .ne. ['foo','bar'])) call abort
+end select
+contains
+  subroutine get_value (value)
+    class(*), allocatable, intent(out) :: value(:)
+    allocate(value, source=['foo','bar'])
+  end subroutine
+end