This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
Re: [Fortran, Patch, PR70842, v1] [4.9/5/6/7 Regression] internal compiler error with character members within a polymorphic pointer
- From: Andre Vehreschild <vehre at gmx dot de>
- To: Jerry DeLisle <jvdelisle at charter dot net>
- Cc: fortran at gcc dot gnu dot org
- Date: Thu, 14 Jul 2016 19:08:52 +0200
- Subject: Re: [Fortran, Patch, PR70842, v1] [4.9/5/6/7 Regression] internal compiler error with character members within a polymorphic pointer
- Authentication-results: sourceware.org; auth=none
- References: <20160714165607.54c9a364@vepi2> <4b7fb296-ec45-f61a-a957-0428362a28c5@charter.net>
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
+