re PR fortran/82511 (ICE Bad IO basetype (12) on attempted read or write of entire DEC structure)
2017-10-16 Fritz Reese <fritzoreese@gmail.com> PR fortran/82511 Treat UNION components as DT comp. in I/O lists. gcc/fortran/ChangeLog: PR fortran/82511 * trans-io.c (transfer_expr): Treat BT_UNION as BT_DERIVED. gcc/testsuite/ChangeLog: PR fortran/82511 * gfortran.dg/dec_structure_22.f90: New testcase. From-SVN: r253791
This commit is contained in:
parent
01118373fe
commit
9b460e2e50
4 changed files with 50 additions and 2 deletions
|
@ -1,3 +1,8 @@
|
|||
2017-10-16 Fritz Reese <fritzoreese@gmail.com>
|
||||
|
||||
PR fortran/82511
|
||||
* trans-io.c (transfer_expr): Treat BT_UNION as BT_DERIVED.
|
||||
|
||||
2017-10-15 Thomas Koenig <tkoenig@gcc.gnu.org>
|
||||
|
||||
PR fortran/82372
|
||||
|
|
|
@ -2404,7 +2404,7 @@ transfer_expr (gfc_se * se, gfc_typespec * ts, tree addr_expr,
|
|||
case BT_CLASS:
|
||||
if (ts->u.derived->components == NULL)
|
||||
return;
|
||||
if (ts->type == BT_DERIVED || ts->type == BT_CLASS)
|
||||
if (gfc_bt_struct (ts->type) || ts->type == BT_CLASS)
|
||||
{
|
||||
gfc_symbol *derived;
|
||||
gfc_symbol *dtio_sub = NULL;
|
||||
|
@ -2438,7 +2438,7 @@ transfer_expr (gfc_se * se, gfc_typespec * ts, tree addr_expr,
|
|||
function = iocall[IOCALL_X_DERIVED];
|
||||
break;
|
||||
}
|
||||
else if (ts->type == BT_DERIVED)
|
||||
else if (gfc_bt_struct (ts->type))
|
||||
{
|
||||
/* Recurse into the elements of the derived type. */
|
||||
expr = gfc_evaluate_now (addr_expr, &se->pre);
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2017-10-16 Fritz Reese <fritzoreese@gmail.com>
|
||||
|
||||
PR fortran/82511
|
||||
* gfortran.dg/dec_structure_22.f90: New testcase.
|
||||
|
||||
2017-10-16 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
PR c++/64931
|
||||
|
|
38
gcc/testsuite/gfortran.dg/dec_structure_22.f90
Normal file
38
gcc/testsuite/gfortran.dg/dec_structure_22.f90
Normal file
|
@ -0,0 +1,38 @@
|
|||
! { dg-do run }
|
||||
! { dg-options "-fdec-structure" }
|
||||
!
|
||||
! PR fortran/82511
|
||||
!
|
||||
! Verify that structure variables with UNION components
|
||||
! are accepted in an I/O-list READ.
|
||||
!
|
||||
implicit none
|
||||
|
||||
structure /s/
|
||||
union
|
||||
map
|
||||
character(16) :: c16_1
|
||||
end map
|
||||
map
|
||||
character(16) :: c16_2
|
||||
end map
|
||||
end union
|
||||
end structure
|
||||
|
||||
record /s/ r
|
||||
character(32) :: instr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^"
|
||||
|
||||
r.c16_1 = ' '
|
||||
r.c16_2 = ' '
|
||||
! The record r shall be treated as if its components are listed:
|
||||
! read(...) r.c16_1, r.c16_2
|
||||
! This shall correspond to the formatted read of A16,A16
|
||||
read(instr, '(A16,A16)') r
|
||||
|
||||
! r.c16_1 and r.c16_2 are in a union, thus share the same memory
|
||||
! and the first 16 bytes of instr are overwritten
|
||||
if ( r.c16_1 .ne. instr(17:32) .or. r.c16_2 .ne. instr(17:32) ) then
|
||||
call abort()
|
||||
endif
|
||||
|
||||
end
|
Loading…
Add table
Reference in a new issue