mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-25 02:10:38 +08:00
re PR fortran/65024 ([OOP] unlimited polymorphic pointer structure not built when it should be)
2015-03-10 Paul Thomas <pault@gcc.gnu.org> 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 <pault@gcc.gnu.org> PR fortran/65024 * gfortran.dg/unlimited_polymorphic_23.f90: New test From-SVN: r221334
This commit is contained in:
parent
704c79040a
commit
48188959fd
gcc
@ -1,3 +1,10 @@
|
||||
2015-03-10 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
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 <fanfarillo.gcc@gmail.com>
|
||||
Tobias Burnus <burnus@net-b.de>
|
||||
|
||||
|
@ -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
|
||||
|
@ -1,3 +1,8 @@
|
||||
2015-03-10 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/65024
|
||||
* gfortran.dg/unlimited_polymorphic_23.f90: New test
|
||||
|
||||
2015-03-10 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/65127
|
||||
|
35
gcc/testsuite/gfortran.dg/unlimited_polymorphic_23.f90
Normal file
35
gcc/testsuite/gfortran.dg/unlimited_polymorphic_23.f90
Normal file
@ -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 <matt@gneilson.plus.com>
|
||||
!
|
||||
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
|
Loading…
x
Reference in New Issue
Block a user