Commit 9b460e2e by Fritz Reese Committed by Fritz Reese

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
parent 01118373
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> 2017-10-15 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/82372 PR fortran/82372
......
...@@ -2404,7 +2404,7 @@ transfer_expr (gfc_se * se, gfc_typespec * ts, tree addr_expr, ...@@ -2404,7 +2404,7 @@ transfer_expr (gfc_se * se, gfc_typespec * ts, tree addr_expr,
case BT_CLASS: case BT_CLASS:
if (ts->u.derived->components == NULL) if (ts->u.derived->components == NULL)
return; 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 *derived;
gfc_symbol *dtio_sub = NULL; gfc_symbol *dtio_sub = NULL;
...@@ -2438,7 +2438,7 @@ transfer_expr (gfc_se * se, gfc_typespec * ts, tree addr_expr, ...@@ -2438,7 +2438,7 @@ transfer_expr (gfc_se * se, gfc_typespec * ts, tree addr_expr,
function = iocall[IOCALL_X_DERIVED]; function = iocall[IOCALL_X_DERIVED];
break; break;
} }
else if (ts->type == BT_DERIVED) else if (gfc_bt_struct (ts->type))
{ {
/* Recurse into the elements of the derived type. */ /* Recurse into the elements of the derived type. */
expr = gfc_evaluate_now (addr_expr, &se->pre); expr = gfc_evaluate_now (addr_expr, &se->pre);
......
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> 2017-10-16 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/64931 PR c++/64931
......
! { 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
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