From: Paul Thomas Date: Tue, 10 Mar 2015 19:39:05 +0000 (+0000) Subject: re PR fortran/65024 ([OOP] unlimited polymorphic pointer structure not built when... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=48188959fd8a9bb1d7da833466f314210693bc11;p=gcc.git re PR fortran/65024 ([OOP] unlimited polymorphic pointer structure not built when it should be) 2015-03-10 Paul Thomas PR fortran/65024 * trans-expr.c (gfc_conv_component_ref): If the component backend declaration is missing and the derived type symbol is available in the reference, call gfc_build_derived_type. 2015-03-10 Paul Thomas PR fortran/65024 * gfortran.dg/unlimited_polymorphic_23.f90: New test From-SVN: r221334 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index ae6865eff41..b9f34a33c67 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2015-03-10 Paul Thomas + + PR fortran/65024 + * trans-expr.c (gfc_conv_component_ref): If the component + backend declaration is missing and the derived type symbol is + available in the reference, call gfc_build_derived_type. + 2015-03-10 Alessandro Fanfarillo Tobias Burnus diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index db04b30671d..353d0120d9d 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -1930,10 +1930,12 @@ gfc_conv_component_ref (gfc_se * se, gfc_ref * ref) c = ref->u.c.component; - gcc_assert (c->backend_decl); + if (c->backend_decl == NULL_TREE + && ref->u.c.sym != NULL) + gfc_get_derived_type (ref->u.c.sym); field = c->backend_decl; - gcc_assert (TREE_CODE (field) == FIELD_DECL); + gcc_assert (field && TREE_CODE (field) == FIELD_DECL); decl = se->expr; /* Components can correspond to fields of different containing diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e0daa10eb9b..5acef589ff2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-03-10 Paul Thomas + + PR fortran/65024 + * gfortran.dg/unlimited_polymorphic_23.f90: New test + 2015-03-10 Jakub Jelinek PR c++/65127 diff --git a/gcc/testsuite/gfortran.dg/unlimited_polymorphic_23.f90 b/gcc/testsuite/gfortran.dg/unlimited_polymorphic_23.f90 new file mode 100644 index 00000000000..27eff310532 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/unlimited_polymorphic_23.f90 @@ -0,0 +1,35 @@ +! {dg-do run } +! +! Test the fix for PR65024, in which the structure for the 'info' +! component of type 'T' was not being converted into TREE_SSA and +! so caused an ICE in trans-expr.c:gfc_conv_component_ref. +! +! Reported by +! +MODULE X + TYPE T + CLASS(*), pointer :: info + END TYPE +END MODULE + +PROGRAM P + call bug +CONTAINS + SUBROUTINE BUG + USE X + CLASS(T), pointer :: e + integer, target :: i = 42 + allocate(e) + e%info => NULL () ! used to ICE + if (.not.associated(e%info)) e%info => i ! used to ICE + select type (z => e%info) + type is (integer) + if (z .ne.i) call abort + end select + END SUBROUTINE + + SUBROUTINE NEXT + USE X + CLASS (T), pointer :: e + END SUBROUTINE +END