re PR fortran/70842 (internal compiler error with character members within a polymorp...
authorAndre Vehreschild <vehre@gcc.gnu.org>
Thu, 14 Jul 2016 17:07:47 +0000 (19:07 +0200)
committerAndre Vehreschild <vehre@gcc.gnu.org>
Thu, 14 Jul 2016 17:07:47 +0000 (19:07 +0200)
gcc/testsuite/ChangeLog:

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

PR fortran/70842
* gfortran.dg/select_type_35.f03: New test.

gcc/fortran/ChangeLog:

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

PR fortran/70842
* simplify.c (gfc_simplify_len): Only for unlimited polymorphic
types replace the expression's _data ref with a _len ref.

From-SVN: r238347

gcc/fortran/ChangeLog
gcc/fortran/simplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/select_type_35.f03 [new file with mode: 0644]

index 8b71025d7acf33537f6927cdac3f80b501435db3..0abf7d03045ff74ec3c6dbfb33519af4d9195440 100644 (file)
@@ -1,3 +1,9 @@
+2016-07-14  Andre Vehreschild  <vehre@gcc.gnu.org>
+
+       PR fortran/70842
+       * simplify.c (gfc_simplify_len): Only for unlimited polymorphic
+       types replace the expression's _data ref with a _len ref.
+
 2016-07-09  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR fortran/71783
index 95a8d1080a4c7373d48b52d3a8844ffe06917bdc..8096a926161a0dc1c0a3bb5c47dfa2b102c226c8 100644 (file)
@@ -3816,8 +3816,12 @@ gfc_simplify_len (gfc_expr *e, gfc_expr *kind)
     }
   else if (e->expr_type == EXPR_VARIABLE && e->ts.type == BT_CHARACTER
           && e->symtree->n.sym
+          && e->symtree->n.sym->ts.type != BT_DERIVED
           && e->symtree->n.sym->assoc && e->symtree->n.sym->assoc->target
-          && e->symtree->n.sym->assoc->target->ts.type == BT_DERIVED)
+          && e->symtree->n.sym->assoc->target->ts.type == BT_DERIVED
+          && e->symtree->n.sym->assoc->target->symtree->n.sym
+          && UNLIMITED_POLY (e->symtree->n.sym->assoc->target->symtree->n.sym))
+
     /* The expression in assoc->target points to a ref to the _data component
        of the unlimited polymorphic entity.  To get the _len component the last
        _data ref needs to be stripped and a ref to the _len component added.  */
index 9eeec45ee2c0d12bb964173c6d8ed2f9c2031a83..ef810565182ada45b1cb79c89be31b5b5d3a210a 100644 (file)
@@ -1,3 +1,8 @@
+2016-07-14  Andre Vehreschild  <vehre@gcc.gnu.org>
+
+       PR fortran/70842
+       * gfortran.dg/select_type_35.f03: New test.
+
 2016-07-14  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        PR target/65951
diff --git a/gcc/testsuite/gfortran.dg/select_type_35.f03 b/gcc/testsuite/gfortran.dg/select_type_35.f03
new file mode 100644 (file)
index 0000000..92d2f27
--- /dev/null
@@ -0,0 +1,41 @@
+! { dg-do run }
+!
+! Contributed by Nathanael Huebbe
+! Check fix for PR/70842
+
+program foo
+
+  TYPE, ABSTRACT :: t_Intermediate
+  END TYPE t_Intermediate
+
+  type, extends(t_Intermediate) :: t_Foo
+    character(:), allocatable :: string
+  end type t_Foo
+
+  class(t_Foo), allocatable :: obj
+
+  allocate(obj)
+  obj%string = "blabarfoo"
+
+  call bar(obj)
+
+  deallocate(obj)
+contains
+  subroutine bar(me)
+    class(t_Intermediate), target :: me
+
+    class(*), pointer :: alias
+
+    select type(me)
+      type is(t_Foo)
+      if (len(me%string) /= 9) call abort()
+    end select
+
+    alias => me
+    select type(alias)
+      type is(t_Foo)
+        if (len(alias%string) /= 9) call abort()
+    end select
+  end subroutine bar
+end program foo
+