aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2016-11-05 07:11:24 +0000
committerPaul Thomas <pault@gcc.gnu.org>2016-11-05 07:11:24 +0000
commitd233ee5f50926d58da601e4f8633d98632ced3d2 (patch)
treefcf8b51f76ca765ffff8c3d6689854e1dc684506 /gcc
parent655a8355666bc3a238e6461409995f30817aff67 (diff)
downloadgcc-d233ee5f50926d58da601e4f8633d98632ced3d2.zip
gcc-d233ee5f50926d58da601e4f8633d98632ced3d2.tar.gz
gcc-d233ee5f50926d58da601e4f8633d98632ced3d2.tar.bz2
re PR fortran/67564 (Segfault on sourced allocattion statement with class(*) arrays)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog8
-rw-r--r--gcc/fortran/trans-expr.c6
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gfortran.dg/select_type_39.f0320
4 files changed, 39 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index f6b739c..bf85619 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index 7159b17..309f502 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -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)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3babf14..4369222 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..08d6195
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/select_type_39.f03
@@ -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