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:
parent
991f3b1289
commit
92c59193a1
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
24
gcc/testsuite/gfortran.dg/auto_char_len_4.f90
Normal file
24
gcc/testsuite/gfortran.dg/auto_char_len_4.f90
Normal 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
|
||||
|
Loading…
Reference in New Issue
Block a user