summaryrefslogtreecommitdiffstats
path: root/gcc/fortran/trans-expr.c
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2009-05-18 10:24:34 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2009-05-18 10:24:34 +0000
commit1d9f9adcb1c9ab9e1690876a7aeaa5e04bfa787e (patch)
treeabb6405002d7187f691ad6cf028c033316497573 /gcc/fortran/trans-expr.c
parent2a3814502f1a35507ce7c5670f06503819e05034 (diff)
downloadppe42-gcc-1d9f9adcb1c9ab9e1690876a7aeaa5e04bfa787e.tar.gz
ppe42-gcc-1d9f9adcb1c9ab9e1690876a7aeaa5e04bfa787e.zip
2009-05-18 Richard Guenther <rguenther@suse.de>
PR fortran/40168 * trans-expr.c (gfc_trans_zero_assign): For local array destinations use an assignment from an empty constructor. * gfortran.dg/array_memset_2.f90: Adjust. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@147659 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran/trans-expr.c')
-rw-r--r--gcc/fortran/trans-expr.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index cf17598c9f6..a20d3ae8892 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -4428,11 +4428,14 @@ gfc_trans_zero_assign (gfc_expr * expr)
len = fold_build2 (MULT_EXPR, gfc_array_index_type, len,
fold_convert (gfc_array_index_type, tmp));
- /* Convert arguments to the correct types. */
+ /* If we are zeroing a local array avoid taking its address by emitting
+ a = {} instead. */
if (!POINTER_TYPE_P (TREE_TYPE (dest)))
- dest = gfc_build_addr_expr (pvoid_type_node, dest);
- else
- dest = fold_convert (pvoid_type_node, dest);
+ return build2 (MODIFY_EXPR, void_type_node,
+ dest, build_constructor (TREE_TYPE (dest), NULL));
+
+ /* Convert arguments to the correct types. */
+ dest = fold_convert (pvoid_type_node, dest);
len = fold_convert (size_type_node, len);
/* Construct call to __builtin_memset. */
OpenPOWER on IntegriCloud