OSDN Git Service

2007-03-11 Paul Thomas <pault@gcc.gnu.org>
authorpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 11 Mar 2007 16:17:32 +0000 (16:17 +0000)
committerpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 11 Mar 2007 16:17:32 +0000 (16:17 +0000)
PR fortran/30883
* parse.c (parse_interface): Use the default types from the
formal namespace if a function or its result do not have a type
after parsing the specification statements.

2007-03-11  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/30883
* gfortran.dg/interface_11.f90: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@122822 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/parse.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/interface_11.f90 [new file with mode: 0644]

index 67825bf..debe015 100644 (file)
@@ -1,3 +1,10 @@
+2007-03-11  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/30883
+       * parse.c (parse_interface): Use the default types from the
+       formal namespace if a function or its result do not have a type
+       after parsing the specification statements.
+
 2007-03-08  Brooks Moses  <brooks.moses@codesourcery.com>
 
        * intrinsic.texi: (ICHAR) Improve internal I/O note.
index 6e36ea2..2d17167 100644 (file)
@@ -1782,6 +1782,20 @@ decl:
   /* Read data declaration statements.  */
   st = parse_spec (ST_NONE);
 
+  /* Since the interface block does not permit an IMPLICIT statement,
+     the default type for the function or the result must be taken
+     from the formal namespace.  */
+  if (new_state == COMP_FUNCTION)
+    {
+       if (prog_unit->result == prog_unit
+             && prog_unit->ts.type == BT_UNKNOWN)
+         gfc_set_default_type (prog_unit, 1, prog_unit->formal_ns);
+       else if (prog_unit->result != prog_unit
+                  && prog_unit->result->ts.type == BT_UNKNOWN)
+         gfc_set_default_type (prog_unit->result, 1,
+                               prog_unit->formal_ns);
+    }
+
   if (st != ST_END_SUBROUTINE && st != ST_END_FUNCTION)
     {
       gfc_error ("Unexpected %s statement at %C in INTERFACE body",
index 886bc4e..2276ea0 100644 (file)
@@ -1,3 +1,8 @@
+2007-03-11  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/30883
+       * gfortran.dg/interface_11.f90: New test.
+
 2007-03-11  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/31115
diff --git a/gcc/testsuite/gfortran.dg/interface_11.f90 b/gcc/testsuite/gfortran.dg/interface_11.f90
new file mode 100644 (file)
index 0000000..a143bb3
--- /dev/null
@@ -0,0 +1,29 @@
+! { dg-do compile }
+! Tests the fix for PR30883 in which interface functions and
+! their results did not get an implicit type.
+!
+! Contributed by Joost VandeVondele <jv244@cam.ac.uk>
+!
+MODULE M1
+  IMPLICIT NONE
+CONTAINS
+  SUBROUTINE S1(F1, F2, G1, G2)
+    INTERFACE
+      FUNCTION F1(i, a)
+      END FUNCTION F1
+      FUNCTION F2(i, a)
+        implicit complex (a-z)
+      END FUNCTION F2
+    END INTERFACE
+    INTERFACE
+      FUNCTION g1(i, a) result(z)
+      END FUNCTION g1
+      FUNCTION g2(i, a) result(z)
+        implicit complex (a-z)
+      END FUNCTION g2
+    END INTERFACE
+  END SUBROUTINE S1
+END MODULE
+
+END
+! { dg-final { cleanup-modules "m1" } }