Commit 4df0f7da by Tobias Burnus Committed by Tobias Burnus

re PR fortran/51869 (Realloc on assignment wrongly assumes that MALLOC returnes '\0'-set memory)

2012-01-17  Tobias Burnus  <burnus@net-b.de>
            Janne Blomqvist  <jb@gcc.gnu.org>

        PR fortran/51869
        * trans-expr.c (alloc_scalar_allocatable_for_assignment): Nullify
        LHS after allocation, if it has allocatable components.
        * f95-lang.c (gfc_init_builtin_functions): Add BUILT_IN_CALLOC.

2012-01-17  Tobias Burnus  <burnus@net-b.de>

        PR fortran/51869
        * gfortran.dg/realloc_on_assign_9.f90: New.


Co-Authored-By: Janne Blomqvist <jb@gcc.gnu.org>

From-SVN: r183247
parent 1efa38d1
2012-01-17 Tobias Burnus <burnus@net-b.de>
Janne Blomqvist <jb@gcc.gnu.org>
PR fortran/51869
* trans-expr.c (alloc_scalar_allocatable_for_assignment): Nullify
LHS after allocation, if it has allocatable components.
* f95-lang.c (gfc_init_builtin_functions): Add BUILT_IN_CALLOC.
2012-01-16 Mikael Morin <mikael@gcc.gnu.org>
Tobias Burnus <burnus@net-b.de>
......
......@@ -1007,6 +1007,12 @@ gfc_init_builtin_functions (void)
"malloc", ATTR_NOTHROW_LEAF_LIST);
DECL_IS_MALLOC (builtin_decl_explicit (BUILT_IN_MALLOC)) = 1;
ftype = build_function_type_list (pvoid_type_node, size_type_node,
size_type_node, NULL_TREE);
gfc_define_builtin ("__builtin_calloc", ftype, BUILT_IN_CALLOC,
"calloc", ATTR_NOTHROW_LEAF_LIST);
DECL_IS_MALLOC (builtin_decl_explicit (BUILT_IN_CALLOC)) = 1;
ftype = build_function_type_list (pvoid_type_node,
size_type_node, pvoid_type_node,
NULL_TREE);
......
......@@ -6585,11 +6585,24 @@ alloc_scalar_allocatable_for_assignment (stmtblock_t *block,
size_in_bytes = size;
}
tmp = build_call_expr_loc (input_location,
builtin_decl_explicit (BUILT_IN_MALLOC),
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_CALLOC),
2, build_one_cst (size_type_node),
size_in_bytes);
tmp = fold_convert (TREE_TYPE (lse.expr), tmp);
gfc_add_modify (block, lse.expr, tmp);
}
else
{
tmp = build_call_expr_loc (input_location,
builtin_decl_explicit (BUILT_IN_MALLOC),
1, size_in_bytes);
tmp = fold_convert (TREE_TYPE (lse.expr), tmp);
gfc_add_modify (block, lse.expr, tmp);
}
if (expr1->ts.type == BT_CHARACTER && expr1->ts.deferred)
{
/* Deferred characters need checking for lhs and rhs string
......
2012-01-17 Tobias Burnus <burnus@net-b.de>
PR fortran/51869
* gfortran.dg/realloc_on_assign_9.f90: New.
2012-01-17 Aldy Hernandez <aldyh@redhat.com>
PR other/51165
......
! { 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" } }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment