diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index d758a484db439b5397df4b7cbfd7005fdc209444..b9c5944829ac6a7eb4003a09739387eeead67a33 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 5bd8296b55b888092d86e6d37d8ef9173170bd6c..e798070224c6d83c2d5b5246880e12826371a147 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 564af554773178814ef9d251e630e25dc3ebc9b0..ae046ed0c3e12f8dddfec3ef30052bbd06d69dcf 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
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 0000000000000000000000000000000000000000..3749abd8ed3075d2174c0bee30cae29174c38514
--- /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  <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
+