From: Paul Thomas Date: Tue, 8 Jul 2014 19:51:04 +0000 (+0000) Subject: re PR fortran/61459 (segfault when assigning to allocatable function result from... X-Git-Tag: releases/gcc-4.8.4~369 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=72123d2b822d4a4bc2335cdfac04bd9367e85041;p=thirdparty%2Fgcc.git re PR fortran/61459 (segfault when assigning to allocatable function result from matmul result) 2014-07-08 Paul Thomas 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-08 Paul Thomas PR fortran/61459 PR fortran/58883 * gfortran.dg/allocatable_function_8.f90 : New test From-SVN: r212369 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 65cfa6ffe936..c0ab45701357 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2014-07-08 Paul Thomas + + 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-02 Jakub Jelinek Fritz Reese diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index d6411b0f5ecd..850ed834a58b 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -7096,7 +7096,7 @@ fcncall_realloc_result (gfc_se *se, int rank) res_desc = gfc_evaluate_now (desc, &se->pre); 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 the lhs descriptor. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 95ea849ae065..212d42a0923a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2014-07-08 Paul Thomas + + PR fortran/61459 + PR fortran/58883 + * gfortran.dg/allocatable_function_8.f90 : New test + 2014-07-04 Jakub Jelinek PR tree-optimization/61684 diff --git a/gcc/testsuite/gfortran.dg/allocatable_function_8.f90 b/gcc/testsuite/gfortran.dg/allocatable_function_8.f90 new file mode 100644 index 000000000000..7d0d69d20438 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/allocatable_function_8.f90 @@ -0,0 +1,47 @@ +! { dg-do run } +! Test the fix for PR61459. +! +! Contributed by John Wingate +! +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 + y = f_workaround (x) + if (any (f_segfault (x) .ne. y)) call abort + if (any (f_segfault_plus (x) .ne. y)) call abort +end program main