This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Fortran, Patch, PR70842, v1] [4.9/5/6/7 Regression] internal compiler error with character members within a polymorphic pointer


Hi Jerry,

thanks for the fast review. Committed to trunk as r238347. Will wait
one week before applying to the other branches.

Regards,
	Andre

On Thu, 14 Jul 2016 09:12:27 -0700
Jerry DeLisle <jvdelisle@charter.net> wrote:

> On 07/14/2016 07:56 AM, Andre Vehreschild wrote:
> > Hi all,
> >
> > attached patch fixes the ICE and the wrong char array length
> > mentioned in comment #3 of the PR. The issue was that getting the
> > _len component is valid online for unlimited polymorphic pointers.
> > But here this was tried for polymorphic entity, which had to fail.
> >
> > Bootstrapped and regtests ok on trunk, gcc-6-branch, gcc-5-branch,
> > gcc-4_9-branch. Ok for trunk and one week later for the other
> > branches?
> >
> > Regards,
> > 	Andre
> >  
> 
> Yes, OK and thanks for patch. (Maybe add a blank line just before the 
> existing comment shown in the patch.)
> 
> Regards,
> 
> Jerry


-- 
Andre Vehreschild * Email: vehre ad gmx dot de 
Index: gcc/fortran/ChangeLog
===================================================================
--- gcc/fortran/ChangeLog	(Revision 238344)
+++ gcc/fortran/ChangeLog	(Arbeitskopie)
@@ -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: gcc/fortran/simplify.c
===================================================================
--- gcc/fortran/simplify.c	(Revision 238344)
+++ gcc/fortran/simplify.c	(Arbeitskopie)
@@ -3816,8 +3816,12 @@
     }
   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: gcc/testsuite/ChangeLog
===================================================================
--- gcc/testsuite/ChangeLog	(Revision 238344)
+++ gcc/testsuite/ChangeLog	(Arbeitskopie)
@@ -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
Index: gcc/testsuite/gfortran.dg/select_type_35.f03
===================================================================
--- gcc/testsuite/gfortran.dg/select_type_35.f03	(nicht existent)
+++ gcc/testsuite/gfortran.dg/select_type_35.f03	(Arbeitskopie)
@@ -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
+

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]