Commit 3af52023 by Paul Thomas

re PR fortran/61459 (segfault when assigning to allocatable function result from matmul result)

2014-07-07  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/61459
	PR fortran/58883
	* trans-expr.c (fcncall_realloc_result): Use the natural type
	for the address expression of 'res_desc'.

2014-07-07  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/61459
	PR fortran/58883
	* gfortran.dg/allocatable_function_8.f90 : New test

From-SVN: r212339
parent 72732f3e
2014-07-07 Paul Thomas <pault@gcc.gnu.org>
PR fortran/61459
PR fortran/58883
* trans-expr.c (fcncall_realloc_result): Use the natural type
for the address expression of 'res_desc'.
2014-07-07 Gerald Pfeifer <gerald@pfeifer.com> 2014-07-07 Gerald Pfeifer <gerald@pfeifer.com>
* gfortran.texi (Fortran 2003 status): Fix grammar. * gfortran.texi (Fortran 2003 status): Fix grammar.
......
...@@ -7302,7 +7302,7 @@ fcncall_realloc_result (gfc_se *se, int rank) ...@@ -7302,7 +7302,7 @@ fcncall_realloc_result (gfc_se *se, int rank)
res_desc = gfc_evaluate_now (desc, &se->pre); res_desc = gfc_evaluate_now (desc, &se->pre);
gfc_conv_descriptor_data_set (&se->pre, res_desc, null_pointer_node); gfc_conv_descriptor_data_set (&se->pre, res_desc, null_pointer_node);
se->expr = gfc_build_addr_expr (TREE_TYPE (se->expr), res_desc); se->expr = gfc_build_addr_expr (NULL_TREE, res_desc);
/* Free the lhs after the function call and copy the result data to /* Free the lhs after the function call and copy the result data to
the lhs descriptor. */ the lhs descriptor. */
......
2014-07-07 Paul Thomas <pault@gcc.gnu.org>
PR fortran/61459
PR fortran/58883
* gfortran.dg/allocatable_function_8.f90 : New test
2014-07-07 Maciej W. Rozycki <macro@codesourcery.com> 2014-07-07 Maciej W. Rozycki <macro@codesourcery.com>
* gcc.target/powerpc/spe-evmerge.c: New file. * gcc.target/powerpc/spe-evmerge.c: New file.
......
! { dg-do run }
! Test the fix for PR61459 and PR58883.
!
! Contributed by John Wingate <johnww@tds.net>
! and Tao Song <songtao.thu@gmail.com>
!
module a
implicit none
private
public :: f_segfault, f_segfault_plus, f_workaround
integer, dimension(2,2) :: b = reshape([1,-1,1,1],[2,2])
contains
function f_segfault(x)
real, dimension(:), allocatable :: f_segfault
real, dimension(:), intent(in) :: x
allocate(f_segfault(2))
f_segfault = matmul(b,x)
end function f_segfault
! Sefaulted without the ALLOCATE as well.
function f_segfault_plus(x)
real, dimension(:), allocatable :: f_segfault_plus
real, dimension(:), intent(in) :: x
f_segfault_plus = matmul(b,x)
end function f_segfault_plus
function f_workaround(x)
real, dimension(:), allocatable :: f_workaround
real, dimension(:), intent(in) :: x
real, dimension(:), allocatable :: tmp
allocate(f_workaround(2),tmp(2))
tmp = matmul(b,x)
f_workaround = tmp
end function f_workaround
end module a
program main
use a
implicit none
real, dimension(2) :: x = 1.0, y
! PR61459
y = f_workaround (x)
if (any (f_segfault (x) .ne. y)) call abort
if (any (f_segfault_plus (x) .ne. y)) call abort
! PR58883
if (any (foo () .ne. reshape([1,2,3,4,5,6,7,8],[2,4]))) call abort
contains
function foo()
integer, allocatable :: foo(:,:)
integer, allocatable :: temp(:)
temp = [1,2,3,4,5,6,7,8]
foo = reshape(temp,[2,4])
end function
end program main
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment