From 1f8dd420ebf769bd0b8068af416735f082464575 Mon Sep 17 00:00:00 2001 From: Andre Vehreschild Date: Thu, 14 Jul 2016 19:07:47 +0200 Subject: [PATCH] re PR fortran/70842 (internal compiler error with character members within a polymorphic pointer) gcc/testsuite/ChangeLog: 2016-07-14 Andre Vehreschild PR fortran/70842 * gfortran.dg/select_type_35.f03: New test. gcc/fortran/ChangeLog: 2016-07-14 Andre Vehreschild 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 | 6 +++ gcc/fortran/simplify.c | 6 ++- gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gfortran.dg/select_type_35.f03 | 41 ++++++++++++++++++++ 4 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/select_type_35.f03 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 8b71025d7ac..0abf7d03045 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2016-07-14 Andre Vehreschild + + 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 PR fortran/71783 diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c index 95a8d1080a4..8096a926161 100644 --- a/gcc/fortran/simplify.c +++ b/gcc/fortran/simplify.c @@ -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. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9eeec45ee2c..ef810565182 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-07-14 Andre Vehreschild + + PR fortran/70842 + * gfortran.dg/select_type_35.f03: New test. + 2016-07-14 Kyrylo Tkachov 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 index 00000000000..92d2f275313 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/select_type_35.f03 @@ -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 + -- 2.30.2