This patch nullifies (scalar) allocatables after malloc, if (and only
if) they contain allocatable components to make sure that no
uninitialized memory is accessed.
Build and regtested on x86-64-linux.
OK for the trunk?
Tobias
2012-01-17 Tobias Burnus <bur...@net-b.de>
PR fortran/51869
* trans-expr.c (alloc_scalar_allocatable_for_assignment): Nullify
LHS after allocation, if it has allocatable components.
2012-01-17 Tobias Burnus <bur...@net-b.de>
PR fortran/51869
* gfortran.dg/realloc_on_assign_9.f90: New.
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index 14411e0..c709265 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -6590,6 +6597,15 @@ alloc_scalar_allocatable_for_assignment (stmtblock_t *block,
1, size_in_bytes);
tmp = fold_convert (TREE_TYPE (lse.expr), tmp);
gfc_add_modify (block, lse.expr, tmp);
+
+ if (expr1->ts.type == BT_DERIVED && expr1->ts.u.derived->attr.alloc_comp)
+ {
+ tmp = build_call_expr_loc (input_location,
+ builtin_decl_explicit (BUILT_IN_MEMSET),
+ 3, lse.expr, integer_zero_node, size_in_bytes);
+ gfc_add_expr_to_block (block, tmp);
+ }
+
if (expr1->ts.type == BT_CHARACTER && expr1->ts.deferred)
{
/* Deferred characters need checking for lhs and rhs string
--- /dev/null 2012-01-17 08:41:28.951768065 +0100
+++ gcc/gcc/testsuite/gfortran.dg/realloc_on_assign_9.f90 2012-01-17 11:41:41.000000000 +0100
@@ -0,0 +1,34 @@
+! { dg-do run }
+!
+! PR fortran/51869
+!
+module soop_stars_class
+ implicit none
+ type soop_stars
+ real ,dimension(:,:) ,allocatable :: position
+ end type
+ type show
+ type(soop_stars) :: rocket
+ end type
+contains
+ function new_show(boom)
+ type(soop_stars) ,intent(in) :: boom
+ type(show) :: new_show
+ new_show%rocket = boom
+ end function
+end module
+
+program main
+ use soop_stars_class
+ implicit none
+
+ type(soop_stars) :: fireworks
+ type(show), allocatable :: july4
+
+ allocate (fireworks%position(2,2))
+ fireworks%position = 33.0
+
+ july4 = new_show(boom=fireworks)
+end program
+
+! { dg-final { cleanup-modules "soop_stars_class" } }