[multiple changes]

2010-10-26  Tobias Burnus  <burnus@net-b.de>

        PR fortran/45451
        * trans-stmt.c (gfc_trans_allocate): Do a deep-copy for SOURCE=.

        PR fortran/43018
        * trans-array.c (duplicate_allocatable): Use size of type and not
        the size of the pointer to the type.

2010-10-26  Tobias Burnus <burnus@net-b.de>

        PR fortran/45451
        * gfortran.dg/class_allocate_5.f90: New.

From-SVN: r165936
This commit is contained in:
Tobias Burnus 2010-10-26 08:49:43 +02:00 committed by Tobias Burnus
parent 90ecaf87ff
commit 6739e9ec6e
5 changed files with 54 additions and 2 deletions

View File

@ -1,3 +1,12 @@
2010-10-26 Tobias Burnus <burnus@net-b.de>
PR fortran/45451
* trans-stmt.c (gfc_trans_allocate): Do a deep-copy for SOURCE=.
PR fortran/43018
* trans-array.c (duplicate_allocatable): Use size of type and not
the size of the pointer to the type.
2010-10-25 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/46140

View File

@ -6072,7 +6072,7 @@ duplicate_allocatable (tree dest, tree src, tree type, int rank,
null_data = gfc_finish_block (&block);
gfc_init_block (&block);
size = TYPE_SIZE_UNIT (type);
size = TYPE_SIZE_UNIT (TREE_TYPE (type));
if (!no_malloc)
{
tmp = gfc_call_malloc (&block, type, size);

View File

@ -4487,8 +4487,12 @@ gfc_trans_allocate (gfc_code * code)
/* Initialization via SOURCE block
(or static default initializer). */
gfc_expr *rhs = gfc_copy_expr (code->expr3);
if (al->expr->ts.type == BT_CLASS)
if (al->expr->ts.type == BT_CLASS && rhs->expr_type == EXPR_VARIABLE
&& rhs->ts.type != BT_CLASS)
tmp = gfc_trans_assignment (expr, rhs, false, false);
else if (al->expr->ts.type == BT_CLASS)
{
/* TODO: One needs to do a deep-copy for BT_CLASS; cf. PR 46174. */
gfc_se dst,src;
if (rhs->ts.type == BT_CLASS)
gfc_add_component_ref (rhs, "$data");

View File

@ -1,3 +1,8 @@
2010-10-26 Tobias Burnus <burnus@net-b.de>
PR fortran/45451
* gfortran.dg/class_allocate_5.f90: New.
2010-10-25 Rodrigo Rivas Costa <rodrigorivascosta@gmail.com>
Implement opaque-enum-specifiers for C++0x

View File

@ -0,0 +1,34 @@
! { dg-do run }
!
! PR fortran/45451
!
! Contributed by Salvatore Filippone and Janus Weil
!
! Check that ALLOCATE with SOURCE= does a deep copy.
!
program bug23
implicit none
type :: psb_base_sparse_mat
integer, allocatable :: irp(:)
end type psb_base_sparse_mat
class(psb_base_sparse_mat), allocatable :: a
type(psb_base_sparse_mat) :: acsr
allocate(acsr%irp(4))
acsr%irp(1:4) = (/1,3,4,5/)
write(*,*) acsr%irp(:)
allocate(a,source=acsr)
write(*,*) a%irp(:)
call move_alloc(acsr%irp, a%irp)
write(*,*) a%irp(:)
if (any (a%irp /= [1,3,4,5])) call abort()
end program bug23