re PR fortran/25087 (Error for missing explicit interface needed.)

2006-11-22 Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/25087
	* resolve.c (resolve_fl_procedure): Add an error if an external
	automatic character length function does not have an explicit
	interface.

2006-11-22 Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/25087
	* gfortran.dg/auto_char_len_4.f90: New test.

From-SVN: r119077
This commit is contained in:
Paul Thomas 2006-11-22 00:05:10 +00:00
parent 991f3b1289
commit 92c59193a1
4 changed files with 50 additions and 8 deletions

View File

@ -1,3 +1,10 @@
2006-11-22 Paul Thomas <pault@gcc.gnu.org>
PR fortran/25087
* resolve.c (resolve_fl_procedure): Add an error if an external
automatic character length function does not have an explicit
interface.
2006-11-22 Paul Thomas <pault@gcc.gnu.org>
PR fortran/29652

View File

@ -89,8 +89,6 @@ resolve_formal_arglist (gfc_symbol * proc)
gfc_symbol *sym;
int i;
/* TODO: Procedures whose return character length parameter is not constant
or assumed must also have explicit interfaces. */
if (proc->result != NULL)
sym = proc->result;
else
@ -5529,17 +5527,25 @@ resolve_fl_procedure (gfc_symbol *sym, int mp_flag)
&& resolve_fl_var_and_proc (sym, mp_flag) == FAILURE)
return FAILURE;
if (sym->attr.proc == PROC_ST_FUNCTION)
if (sym->ts.type == BT_CHARACTER)
{
if (sym->ts.type == BT_CHARACTER)
{
gfc_charlen *cl = sym->ts.cl;
if (!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT)
{
gfc_charlen *cl = sym->ts.cl;
if (!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT)
{
if (sym->attr.proc == PROC_ST_FUNCTION)
{
gfc_error ("Character-valued statement function '%s' at %L must "
"have constant length", sym->name, &sym->declared_at);
return FAILURE;
}
if (sym->attr.external && sym->formal == NULL
&& cl && cl->length && cl->length->expr_type != EXPR_CONSTANT)
{
gfc_error ("Automatic character length function '%s' at %L must "
"have an explicit interface", sym->name, &sym->declared_at);
return FAILURE;
}
}
}

View File

@ -1,3 +1,8 @@
2006-11-22 Paul Thomas <pault@gcc.gnu.org>
PR fortran/25087
* gfortran.dg/auto_char_len_4.f90: New test.
2006-11-22 Paul Thomas <pault@gcc.gnu.org>
PR fortran/29652

View File

@ -0,0 +1,24 @@
! { dg-do compile }
! Tests the fix for PR25087, in which the following invalid code
! was not detected.
!
! Contributed by Joost VandeVondele <jv244@cam.ac.uk>
!
SUBROUTINE s(n)
CHARACTER(LEN=n), EXTERNAL :: a ! { dg-error "must have an explicit interface" }
interface
function b (m) ! This is OK
CHARACTER(LEN=m) :: b
integer :: m
end function b
end interface
write(6,*) a(n)
write(6,*) b(n)
write(6,*) c()
contains
function c () ! This is OK
CHARACTER(LEN=n):: c
c = ""
end function c
END SUBROUTINE s