Fortran: Fix ICE with -fcheck=pointer [PR100136]
gcc/fortran/ChangeLog: PR fortran/100136 * trans-expr.cc (gfc_conv_procedure_call): Add handling of pointer expressions. gcc/testsuite/ChangeLog: PR fortran/100136 * gfortran.dg/PR100136.f90: New test.
This commit is contained in:
parent
8b633b42af
commit
20d30e737a
2 changed files with 42 additions and 4 deletions
|
@ -7220,16 +7220,15 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
|
|||
else
|
||||
goto end_pointer_check;
|
||||
|
||||
tmp = parmse.expr;
|
||||
if (fsym && fsym->ts.type == BT_CLASS)
|
||||
{
|
||||
tmp = build_fold_indirect_ref_loc (input_location,
|
||||
parmse.expr);
|
||||
if (POINTER_TYPE_P (TREE_TYPE (tmp)))
|
||||
tmp = build_fold_indirect_ref_loc (input_location, tmp);
|
||||
tmp = gfc_class_data_get (tmp);
|
||||
if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (tmp)))
|
||||
tmp = gfc_conv_descriptor_data_get (tmp);
|
||||
}
|
||||
else
|
||||
tmp = parmse.expr;
|
||||
|
||||
/* If the argument is passed by value, we need to strip the
|
||||
INDIRECT_REF. */
|
||||
|
|
39
gcc/testsuite/gfortran.dg/PR100136.f90
Normal file
39
gcc/testsuite/gfortran.dg/PR100136.f90
Normal file
|
@ -0,0 +1,39 @@
|
|||
! { dg-do run }
|
||||
! { dg-options "-fcheck=pointer" }
|
||||
! { dg-shouldfail "Argument not allocated" }
|
||||
! { dg-output "Fortran runtime error: Allocatable actual argument 'c_init2' is not allocated" }
|
||||
!
|
||||
! Tests fix for PR100136
|
||||
!
|
||||
! Test cut down from PR58586
|
||||
!
|
||||
|
||||
module test_pr58586_mod
|
||||
implicit none
|
||||
|
||||
type :: a
|
||||
end type
|
||||
|
||||
type :: c
|
||||
type(a), allocatable :: a
|
||||
end type
|
||||
|
||||
contains
|
||||
|
||||
subroutine add_class_c (d)
|
||||
class(c), value :: d
|
||||
end subroutine
|
||||
|
||||
class(c) function c_init2()
|
||||
allocatable :: c_init2
|
||||
end function
|
||||
|
||||
end module test_pr58586_mod
|
||||
|
||||
program test_pr58586
|
||||
use test_pr58586_mod
|
||||
|
||||
! This needs to execute, to see whether the segfault at runtime is resolved
|
||||
call add_class_c(c_init2())
|
||||
|
||||
end program
|
Loading…
Add table
Reference in a new issue