io.c (resolve_tag_format): New function using code split out and simplified from ...
fortran/ * io.c (resolve_tag_format): New function using code split out and simplified from ... (resolve_tag): ... this function. Simplify logic. Unify IOSTAT, IOLENGTH and SIZE handling. testsuite/ * gfortran.dg/g77/19981216-0.f: Remove dg-warning annotation. * gfortran.dg/io_constraints_1.f90: Make a -std=f95 test. Add warning annotation. * gfortran.dg/iostat_3.f90: Make a -std=f95 test. From-SVN: r128623
This commit is contained in:
parent
770a995067
commit
f25bf34f06
6 changed files with 117 additions and 117 deletions
|
@ -1,3 +1,10 @@
|
|||
2007-09-20 Tobias Schlüter <tobi@gcc.gnu.org>
|
||||
|
||||
* io.c (resolve_tag_format): New function using code split out
|
||||
and simplified from ...
|
||||
(resolve_tag): ... this function. Simplify logic. Unify
|
||||
IOSTAT, IOLENGTH and SIZE handling.
|
||||
|
||||
2007-09-20 Christopher D. Rickett <crickett@lanl.gov>
|
||||
|
||||
PR fortran/33497
|
||||
|
|
214
gcc/fortran/io.c
214
gcc/fortran/io.c
|
@ -1091,6 +1091,75 @@ match_ltag (const io_tag *tag, gfc_st_label ** label)
|
|||
}
|
||||
|
||||
|
||||
/* Resolution of the FORMAT tag, to be called from resolve_tag. */
|
||||
|
||||
static try
|
||||
resolve_tag_format (const gfc_expr *e)
|
||||
{
|
||||
if (e->expr_type == EXPR_CONSTANT
|
||||
&& (e->ts.type != BT_CHARACTER
|
||||
|| e->ts.kind != gfc_default_character_kind))
|
||||
{
|
||||
gfc_error ("Constant expression in FORMAT tag at %L must be "
|
||||
"of type default CHARACTER", &e->where);
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
/* If e's rank is zero and e is not an element of an array, it should be
|
||||
of integer or character type. The integer variable should be
|
||||
ASSIGNED. */
|
||||
if (e->symtree == NULL || e->symtree->n.sym->as == NULL
|
||||
|| e->symtree->n.sym->as->rank == 0)
|
||||
{
|
||||
if (e->ts.type != BT_CHARACTER && e->ts.type != BT_INTEGER)
|
||||
{
|
||||
gfc_error ("FORMAT tag at %L must be of type CHARACTER or INTEGER",
|
||||
&e->where);
|
||||
return FAILURE;
|
||||
}
|
||||
else if (e->ts.type == BT_INTEGER && e->expr_type == EXPR_VARIABLE)
|
||||
{
|
||||
if (gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: ASSIGNED "
|
||||
"variable in FORMAT tag at %L", &e->where)
|
||||
== FAILURE)
|
||||
return FAILURE;
|
||||
if (e->symtree->n.sym->attr.assign != 1)
|
||||
{
|
||||
gfc_error ("Variable '%s' at %L has not been assigned a "
|
||||
"format label", e->symtree->n.sym->name, &e->where);
|
||||
return FAILURE;
|
||||
}
|
||||
}
|
||||
else if (e->ts.type == BT_INTEGER)
|
||||
{
|
||||
gfc_error ("Scalar '%s' in FORMAT tag at %L is not an ASSIGNED "
|
||||
"variable", gfc_basic_typename (e->ts.type), &e->where);
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/* If rank is nonzero, we allow the type to be character under GFC_STD_GNU
|
||||
and other type under GFC_STD_LEGACY. It may be assigned an Hollerith
|
||||
constant. */
|
||||
if (e->ts.type == BT_CHARACTER)
|
||||
{
|
||||
if (gfc_notify_std (GFC_STD_GNU, "Extension: Character array "
|
||||
"in FORMAT tag at %L", &e->where) == FAILURE)
|
||||
return FAILURE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (gfc_notify_std (GFC_STD_LEGACY, "Extension: Non-character "
|
||||
"in FORMAT tag at %L", &e->where) == FAILURE)
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/* Do expression resolution and type-checking on an expression tag. */
|
||||
|
||||
static try
|
||||
|
@ -1102,130 +1171,45 @@ resolve_tag (const io_tag *tag, gfc_expr *e)
|
|||
if (gfc_resolve_expr (e) == FAILURE)
|
||||
return FAILURE;
|
||||
|
||||
if (e->ts.type != tag->type && tag != &tag_format)
|
||||
if (tag == &tag_format)
|
||||
return resolve_tag_format (e);
|
||||
|
||||
if (e->ts.type != tag->type)
|
||||
{
|
||||
gfc_error ("%s tag at %L must be of type %s", tag->name,
|
||||
&e->where, gfc_basic_typename (tag->type));
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
if (tag == &tag_format)
|
||||
if (e->rank != 0)
|
||||
{
|
||||
if (e->expr_type == EXPR_CONSTANT
|
||||
&& (e->ts.type != BT_CHARACTER
|
||||
|| e->ts.kind != gfc_default_character_kind))
|
||||
{
|
||||
gfc_error ("Constant expression in FORMAT tag at %L must be "
|
||||
"of type default CHARACTER", &e->where);
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
/* If e's rank is zero and e is not an element of an array, it should be
|
||||
of integer or character type. The integer variable should be
|
||||
ASSIGNED. */
|
||||
if (e->symtree == NULL || e->symtree->n.sym->as == NULL
|
||||
|| e->symtree->n.sym->as->rank == 0)
|
||||
{
|
||||
if (e->ts.type != BT_CHARACTER && e->ts.type != BT_INTEGER)
|
||||
{
|
||||
gfc_error ("%s tag at %L must be of type %s or %s", tag->name,
|
||||
&e->where, gfc_basic_typename (BT_CHARACTER),
|
||||
gfc_basic_typename (BT_INTEGER));
|
||||
return FAILURE;
|
||||
}
|
||||
else if (e->ts.type == BT_INTEGER && e->expr_type == EXPR_VARIABLE)
|
||||
{
|
||||
if (gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: ASSIGNED "
|
||||
"variable in FORMAT tag at %L", &e->where)
|
||||
== FAILURE)
|
||||
return FAILURE;
|
||||
if (e->symtree->n.sym->attr.assign != 1)
|
||||
{
|
||||
gfc_error ("Variable '%s' at %L has not been assigned a "
|
||||
"format label", e->symtree->n.sym->name,
|
||||
&e->where);
|
||||
return FAILURE;
|
||||
}
|
||||
}
|
||||
else if (e->ts.type == BT_INTEGER)
|
||||
{
|
||||
gfc_error ("scalar '%s' FORMAT tag at %L is not an ASSIGNED "
|
||||
"variable", gfc_basic_typename (e->ts.type),
|
||||
&e->where);
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* if rank is nonzero, we allow the type to be character under
|
||||
GFC_STD_GNU and other type under GFC_STD_LEGACY. It may be
|
||||
assigned an Hollerith constant. */
|
||||
if (e->ts.type == BT_CHARACTER)
|
||||
{
|
||||
if (gfc_notify_std (GFC_STD_GNU, "Extension: Character array "
|
||||
"in FORMAT tag at %L", &e->where)
|
||||
== FAILURE)
|
||||
return FAILURE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (gfc_notify_std (GFC_STD_LEGACY, "Extension: Non-character "
|
||||
"in FORMAT tag at %L", &e->where)
|
||||
== FAILURE)
|
||||
return FAILURE;
|
||||
}
|
||||
return SUCCESS;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (e->rank != 0)
|
||||
{
|
||||
gfc_error ("%s tag at %L must be scalar", tag->name, &e->where);
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
if (tag == &tag_iomsg)
|
||||
{
|
||||
if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: IOMSG tag at %L",
|
||||
&e->where) == FAILURE)
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
if (tag == &tag_iostat && e->ts.kind != gfc_default_integer_kind)
|
||||
{
|
||||
if (gfc_notify_std (GFC_STD_GNU, "Fortran 95 requires default "
|
||||
"INTEGER in IOSTAT tag at %L", &e->where)
|
||||
== FAILURE)
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
if (tag == &tag_size && e->ts.kind != gfc_default_integer_kind)
|
||||
{
|
||||
if (gfc_notify_std (GFC_STD_F2003, "Fortran 95 requires default "
|
||||
"INTEGER in SIZE tag at %L", &e->where)
|
||||
== FAILURE)
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
if (tag == &tag_convert)
|
||||
{
|
||||
if (gfc_notify_std (GFC_STD_GNU, "Extension: CONVERT tag at %L",
|
||||
&e->where) == FAILURE)
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
if (tag == &tag_iolength && e->ts.kind != gfc_default_integer_kind)
|
||||
{
|
||||
if (gfc_notify_std (GFC_STD_F2003, "Fortran 95 requires default "
|
||||
"INTEGER in IOLENGTH tag at %L", &e->where)
|
||||
== FAILURE)
|
||||
return FAILURE;
|
||||
}
|
||||
gfc_error ("%s tag at %L must be scalar", tag->name, &e->where);
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
if (tag == &tag_iomsg)
|
||||
{
|
||||
if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: IOMSG tag at %L",
|
||||
&e->where) == FAILURE)
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
if ((tag == &tag_iostat || tag == &tag_size || tag == &tag_iolength)
|
||||
&& e->ts.kind != gfc_default_integer_kind)
|
||||
{
|
||||
if (gfc_notify_std (GFC_STD_F2003, "Fortran 95 requires default "
|
||||
"INTEGER in %s tag at %L", tag->name, &e->where)
|
||||
== FAILURE)
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
if (tag == &tag_convert)
|
||||
{
|
||||
if (gfc_notify_std (GFC_STD_GNU, "Extension: CONVERT tag at %L",
|
||||
&e->where) == FAILURE)
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,3 +1,10 @@
|
|||
2007-09-20 Tobias Schlüter <tobi@gcc.gnu.org>
|
||||
|
||||
* gfortran.dg/g77/19981216-0.f: Remove dg-warning annotation.
|
||||
* gfortran.dg/io_constraints_1.f90: Make a -std=f95 test. Add
|
||||
warning annotation.
|
||||
* gfortran.dg/iostat_3.f90: Make a -std=f95 test.
|
||||
|
||||
2007-09-20 Christopher D. Rickett <crickett@lanl.gov>
|
||||
|
||||
PR fortran/33497
|
||||
|
|
|
@ -29,7 +29,7 @@ c { dg-do compile }
|
|||
|
||||
name = 'blah'
|
||||
open(unit=8,status='unknown',file=name,form='formatted',
|
||||
F iostat=ios) ! { dg-warning "INTEGER in IOSTAT" }
|
||||
F iostat=ios)
|
||||
|
||||
END
|
||||
* -------------------------------------------
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
! { dg-do compile }
|
||||
! { dg-options "-std=f95" }
|
||||
! Part I of the test of the IO constraints patch, which fixes PRs:
|
||||
! PRs 25053, 25063, 25064, 25066, 25067, 25068, 25069, 25307 and 20862.
|
||||
!
|
||||
|
@ -20,7 +21,7 @@ contains
|
|||
subroutine foo (i)
|
||||
integer :: i
|
||||
write (*, 100) i
|
||||
100 format (1h , "i=", i6) ! This is OK.
|
||||
100 format (1h , "i=", i6) ! { dg-warning "The H format specifier at ... is a Fortran 95 deleted feature" }
|
||||
end subroutine foo
|
||||
|
||||
end module global
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
! { dg-do compile }
|
||||
! { dg-options "-std=f95" }
|
||||
! Testcase for PR libfortran/25068
|
||||
real :: u
|
||||
integer(kind=8) :: i
|
||||
|
|
Loading…
Add table
Reference in a new issue