Commit 0e6928d8 by Tobias Schlüter Committed by Tobias Schlüter

re PR fortran/16400 (Invalid usage of assumed-size arrays is not rejected)

fortran/
PR fortran/16400
PR fortran/16404
(port from g95)
* resolve.c (resolve_transfer): New function.
(resolve_code): Call resolve_transfer in case of EXEC_TRANSFER.

testsuite/
PR fortran/16404
* gfortran.dg/der_io_1.f90: XFAIL illegal testcase.

From-SVN: r86931
parent 6d9901e7
2004-09-01 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
PR fortran/16400
PR fortran/16404
(port from g95)
* resolve.c (resolve_transfer): New function.
(resolve_code): Call resolve_transfer in case of EXEC_TRANSFER.
2004-08-31 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de> 2004-08-31 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
PR fortran/16579 PR fortran/16579
......
...@@ -2962,6 +2962,61 @@ resolve_select (gfc_code * code) ...@@ -2962,6 +2962,61 @@ resolve_select (gfc_code * code)
} }
/* Resolve a transfer statement. This is making sure that:
-- a derived type being transferred has only non-pointer components
-- a derived type being transferred doesn't have private components
-- we're not trying to transfer a whole assumed size array. */
static void
resolve_transfer (gfc_code * code)
{
gfc_typespec *ts;
gfc_symbol *sym;
gfc_ref *ref;
gfc_expr *exp;
exp = code->expr;
if (exp->expr_type != EXPR_VARIABLE)
return;
sym = exp->symtree->n.sym;
ts = &sym->ts;
/* Go to actual component transferred. */
for (ref = code->expr->ref; ref; ref = ref->next)
if (ref->type == REF_COMPONENT)
ts = &ref->u.c.component->ts;
if (ts->type == BT_DERIVED)
{
/* Check that transferred derived type doesn't contain POINTER
components. */
if (derived_pointer (ts->derived))
{
gfc_error ("Data transfer element at %L cannot have "
"POINTER components", &code->loc);
return;
}
if (ts->derived->component_access == ACCESS_PRIVATE)
{
gfc_error ("Data transfer element at %L cannot have "
"PRIVATE components",&code->loc);
return;
}
}
if (sym->as != NULL && sym->as->type == AS_ASSUMED_SIZE
&& exp->ref->type == REF_ARRAY && exp->ref->u.ar.type == AR_FULL)
{
gfc_error ("Data transfer element at %L cannot be a full reference to "
"an assumed-size array", &code->loc);
return;
}
}
/*********** Toplevel code resolution subroutines ***********/ /*********** Toplevel code resolution subroutines ***********/
/* Given a branch to a label and a namespace, if the branch is conforming. /* Given a branch to a label and a namespace, if the branch is conforming.
...@@ -3568,7 +3623,6 @@ resolve_code (gfc_code * code, gfc_namespace * ns) ...@@ -3568,7 +3623,6 @@ resolve_code (gfc_code * code, gfc_namespace * ns)
case EXEC_EXIT: case EXEC_EXIT:
case EXEC_CONTINUE: case EXEC_CONTINUE:
case EXEC_DT_END: case EXEC_DT_END:
case EXEC_TRANSFER:
case EXEC_ENTRY: case EXEC_ENTRY:
break; break;
...@@ -3754,6 +3808,10 @@ resolve_code (gfc_code * code, gfc_namespace * ns) ...@@ -3754,6 +3808,10 @@ resolve_code (gfc_code * code, gfc_namespace * ns)
resolve_branch (code->ext.dt->eor, code); resolve_branch (code->ext.dt->eor, code);
break; break;
case EXEC_TRANSFER:
resolve_transfer (code);
break;
case EXEC_FORALL: case EXEC_FORALL:
resolve_forall_iterators (code->ext.forall_iterator); resolve_forall_iterators (code->ext.forall_iterator);
......
2004-09-01 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
PR fortran/16404
* gfortran.dg/der_io_1.f90: XFAIL illegal testcase.
2004-09-01 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> 2004-09-01 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
PR c/1522 PR c/1522
......
! { dg-do run } ! { dg-do compile }
! IO of derived types containing pointers ! PR 16404 Nr. 8
! IO of derived types containing pointers is not allowed
program der_io_1 program der_io_1
type t type t
integer, pointer :: p integer, pointer :: p
...@@ -10,7 +11,7 @@ program der_io_1 ...@@ -10,7 +11,7 @@ program der_io_1
v%p => i v%p => i
i = 42 i = 42
write (unit=s, fmt='(I2)') v write (unit=s, fmt='(I2)') v ! { dg-error "POINTER components" "" }
if (s .ne. '42') call abort () if (s .ne. '42') call abort ()
end program end program
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