aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/trans-array.c
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2006-03-09 05:52:06 +0000
committerPaul Thomas <pault@gcc.gnu.org>2006-03-09 05:52:06 +0000
commitad5dd90de05dba5f4db6bc4d1e355dab4e4a4696 (patch)
treea01707e32f37b611c2929f463154b2d63f209724 /gcc/fortran/trans-array.c
parent07127a0a3b7a73f24105b80dd63c12d38fe84bf1 (diff)
downloadgcc-ad5dd90de05dba5f4db6bc4d1e355dab4e4a4696.zip
gcc-ad5dd90de05dba5f4db6bc4d1e355dab4e4a4696.tar.gz
gcc-ad5dd90de05dba5f4db6bc4d1e355dab4e4a4696.tar.bz2
re PR fortran/26257 (internal compiler error: Segmentation fault, on function call with assumed shape array parameter)
2006-03-09 Paul Thomas <pault@gcc.gnu.org> PR fortran/26257 * trans-array.c (gfc_conv_expr_descriptor): Exclude calculation of the offset and data when se->data_not_needed is set. * trans.h: Include the data_not_need bit in gfc_se. * trans-intrinsic.c (gfc_conv_intrinsic_size): Set it for SIZE. 2006-03-09 Paul Thomas <pault@gcc.gnu.org> * PR fortran/26257 gfortran.dg/auto_char_len_3.f90: New test From-SVN: r111860
Diffstat (limited to 'gcc/fortran/trans-array.c')
-rw-r--r--gcc/fortran/trans-array.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index 9f5337b..a865d57 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -4172,14 +4172,19 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss)
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->data_not_needed)
+ gfc_conv_descriptor_data_set (&loop.pre, parm, gfc_index_zero_node);
+ else
+ {
+ /* 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)
+ if (se->direct_byref && !se->data_not_needed)
{
/* Set the offset. */
tmp = gfc_conv_descriptor_offset (parm);