[Patch, fortran] PR64578 - [OOP] Seg-fault and ICE with unlimited polymorphic array pointer function
Paul Richard Thomas
paul.richard.thomas@gmail.com
Sat Jan 17 21:26:00 GMT 2015
Applied as 'obvious' in revision 219802.
2015-01-17 Paul Thomas <pault@gcc.gnu.org>
PR fortran/64578
* trans-expr.c (gfc_trans_pointer_assignment): Make sure that
before reinitializing rse, to add the rse.pre to block before
creating 'ptrtemp'.
* trans-intrinsic.c (gfc_conv_associated): Deal with the class
data being a descriptor.
2015-01-17 Paul Thomas <pault@gcc.gnu.org>
PR fortran/64578
* gfortran.dg/unlimited_polymorphic_21.f90: New test
Cheers
Paul
--
Outside of a dog, a book is a man's best friend. Inside of a dog it's
too dark to read.
Groucho Marx
-------------- next part --------------
Index: gcc/fortran/trans-expr.c
===================================================================
*** gcc/fortran/trans-expr.c (revision 219801)
--- gcc/fortran/trans-expr.c (working copy)
*************** gfc_trans_pointer_assignment (gfc_expr *
*** 7075,7080 ****
--- 7075,7081 ----
rse.expr = gfc_class_data_get (rse.expr);
else
{
+ gfc_add_block_to_block (&block, &rse.pre);
tmp = gfc_create_var (TREE_TYPE (rse.expr), "ptrtemp");
gfc_add_modify (&lse.pre, tmp, rse.expr);
*************** gfc_trans_pointer_assignment (gfc_expr *
*** 7146,7151 ****
--- 7147,7153 ----
}
else
{
+ gfc_add_block_to_block (&block, &rse.pre);
tmp = gfc_create_var (TREE_TYPE (rse.expr), "ptrtemp");
gfc_add_modify (&lse.pre, tmp, rse.expr);
Index: gcc/fortran/trans-intrinsic.c
===================================================================
*** gcc/fortran/trans-intrinsic.c (revision 219800)
--- gcc/fortran/trans-intrinsic.c (working copy)
*************** gfc_conv_associated (gfc_se *se, gfc_exp
*** 6554,6560 ****
--- 6554,6564 ----
arg1se.expr = build_fold_indirect_ref_loc (input_location,
arg1se.expr);
if (arg1->expr->ts.type == BT_CLASS)
+ {
tmp2 = gfc_class_data_get (arg1se.expr);
+ if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (tmp2)))
+ tmp2 = gfc_conv_descriptor_data_get (tmp2);
+ }
else
tmp2 = arg1se.expr;
}
Index: gcc/testsuite/gfortran.dg/unlimited_polymorphic_21.f90
===================================================================
*** gcc/testsuite/gfortran.dg/unlimited_polymorphic_21.f90 (revision 0)
--- gcc/testsuite/gfortran.dg/unlimited_polymorphic_21.f90 (working copy)
***************
*** 0 ****
--- 1,35 ----
+ ! { dg-do run }
+ ! Tests the fix for PR64578.
+ !
+ ! Contributed by Damian Rouson <damian@sourceryinstitute.org>
+ !
+ type foo
+ real, allocatable :: component(:)
+ end type
+ type (foo), target :: f
+ class(*), pointer :: ptr(:)
+ allocate(f%component(1),source=[0.99])
+ call associate_pointer(f,ptr)
+ select type (ptr)
+ type is (real)
+ if (abs (ptr(1) - 0.99) > 1e-5) call abort
+ end select
+ ptr => return_pointer(f) ! runtime segmentation fault
+ if (associated(return_pointer(f)) .neqv. .true.) call abort
+ select type (ptr)
+ type is (real)
+ if (abs (ptr(1) - 0.99) > 1e-5) call abort
+ end select
+ contains
+ subroutine associate_pointer(this, item)
+ class(foo), target :: this
+ class(*), pointer :: item(:)
+ item => this%component
+ end subroutine
+ function return_pointer(this)
+ class(foo), target :: this
+ class(*), pointer :: return_pointer(:)
+ return_pointer => this%component
+ end function
+ end
+
More information about the Gcc-patches
mailing list