This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Patch, gfortran] PR26257 - Segmentation fault, on function call with assumed shape array parameter
- From: Paul Thomas <paulthomas2 at wanadoo dot fr>
- To: patch <gcc-patches at gcc dot gnu dot org>, "'fortran at gcc dot gnu dot org'" <fortran at gcc dot gnu dot org>
- Date: Tue, 28 Feb 2006 20:44:49 +0100
- Subject: [Patch, gfortran] PR26257 - Segmentation fault, on function call with assumed shape array parameter
:ADDPATCH fortran:
With reference to the attached testcase, the seg fault due to the
function being use associated - the segfault occurs via the route
gfc_conv_intrinsic_size => gfc_conv_expr_descriptor =>
gfc_build_addr_expr, which is needed to calculate the potential offset
between the full array and the actual argument of SIZE, which is assumed
to be an array section. However, seen from the main program, the
address of a dummy argument of a module procedure is not the most
readily available thing in the world - in fact, it has already gone out
of scope.
Happily, SIZE does not need the offset or the data, come to that. Thus
a patch, in which we check that the symbol belongs to a namespace before
trying to provoke a segfault, judiciously deposited in
gfc_conv_expr_descriptor, does the job. This patch is attached,
together with a testsuite version of the reduced PR testcase.
Regtested on FC3/Athlon.
OK for mainline and 4.1, when reopened?
Paul
2006-02-29 Paul Thomas <pault@gcc.gnu.org>
PR fortran/26257
* trans-array.c (gfc_conv_expr_descriptor): Exclude calculation of
the offset
for arrays without a namespace - ie. module procedure dummies.
2006-02-29 Paul Thomas <pault@gcc.gnu.org>
PR fortran/26257
gfortran.dg/auto_char_len_3.f90: New test
Index: gcc/fortran/trans-array.c
===================================================================
*** gcc/fortran/trans-array.c (revision 111450)
--- gcc/fortran/trans-array.c (working copy)
*************** gfc_conv_expr_descriptor (gfc_se * se, g
*** 3789,3797 ****
--- 3789,3800 ----
tree offset;
int full;
gfc_ref *ref;
+ gfc_symbol *sym;
gcc_assert (ss != gfc_ss_terminator);
+ sym = expr->expr_type == EXPR_VARIABLE ? expr->symtree->n.sym : NULL;
+
/* TODO: Pass constant array constructors without a temporary. */
/* Special case things we know we can pass easily. */
switch (expr->expr_type)
*************** gfc_conv_expr_descriptor (gfc_se * se, g
*** 4143,4154 ****
dim++;
}
! /* Point the data pointer at the first element in the section. */
! tmp = gfc_conv_array_data (desc);
! tmp = build_fold_indirect_ref (tmp);
! tmp = gfc_build_array_ref (tmp, offset);
! offset = gfc_build_addr_expr (gfc_array_dataptr_type (desc), tmp);
! gfc_conv_descriptor_data_set (&loop.pre, parm, offset);
if (se->direct_byref)
{
--- 4146,4160 ----
dim++;
}
! if (!(sym && !sym->ns && !se->direct_byref))
! {
! /* Point the data pointer at the first element in the section. */
! tmp = gfc_conv_array_data (desc);
! tmp = build_fold_indirect_ref (tmp);
! tmp = gfc_build_array_ref (tmp, offset);
! offset = gfc_build_addr_expr (gfc_array_dataptr_type (desc), tmp);
! gfc_conv_descriptor_data_set (&loop.pre, parm, offset);
! }
if (se->direct_byref)
{
! { dg-do run }
! Test the fix for PR26257, in which the implicit reference to
! chararray in the main program call of chararray2string would
! cause a segfault in gfc_build_addr_expr.
!
! Based on the reduced testcase in the PR.
module chtest
contains
function chararray2string(chararray) result(text)
character(len=1), dimension(:) :: chararray ! input
character(len=size(chararray, 1)) :: text ! output
do i = 1,size(chararray,1)
text(i:i) = chararray (i)
end do
end function chararray2string
end module chtest
program TestStringTools
use chtest
character(len=52) :: txt
character(len=1), dimension(52) :: chararr = &
(/(char(i+64),char(i+96), i = 1,26)/)
txt = chararray2string(chararr)
if (txt .ne. "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz") &
call abort ()
end program TestStringTools