diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index d758a484db4..b9c5944829a 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2006-11-22 Paul Thomas + + 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 PR fortran/29652 diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 5bd8296b55b..e798070224c 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -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; + } } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 564af554773..ae046ed0c3e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-11-22 Paul Thomas + + PR fortran/25087 + * gfortran.dg/auto_char_len_4.f90: New test. + 2006-11-22 Paul Thomas PR fortran/29652 diff --git a/gcc/testsuite/gfortran.dg/auto_char_len_4.f90 b/gcc/testsuite/gfortran.dg/auto_char_len_4.f90 new file mode 100644 index 00000000000..3749abd8ed3 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/auto_char_len_4.f90 @@ -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 +! +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 +