OSDN Git Service

2011-01-31 Tobias Burnus <burnus@net-b.de>
authorburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 30 Jan 2011 18:16:12 +0000 (18:16 +0000)
committerburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 30 Jan 2011 18:16:12 +0000 (18:16 +0000)
        PR fortran/47042
        * interface.c (gfc_procedure_use): Add explicit interface check
        * for
        pointer/allocatable functions.

2011-01-31  Tobias Burnus  <burnus@net-b.de>

        PR fortran/47042
        * gfortran.dg/interface_34.f90: New.

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

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

index ce56256..888432e 100644 (file)
@@ -1,3 +1,9 @@
+2011-01-31  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/47042
+       * interface.c (gfc_procedure_use): Add explicit interface check for
+       pointer/allocatable functions.
+
 2011-01-30  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/47523
index 1cbba24..1e5df61 100644 (file)
@@ -2686,6 +2686,30 @@ gfc_procedure_use (gfc_symbol *sym, gfc_actual_arglist **ap, locus *where)
   if (sym->attr.if_source == IFSRC_UNKNOWN)
     {
       gfc_actual_arglist *a;
+
+      if (sym->attr.pointer)
+       {
+         gfc_error("The pointer object '%s' at %L must have an explicit "
+                   "function interface or be declared as array",
+                   sym->name, where);
+         return;
+       }
+
+      if (sym->attr.allocatable && !sym->attr.external)
+       {
+         gfc_error("The allocatable object '%s' at %L must have an explicit "
+                   "function interface or be declared as array",
+                   sym->name, where);
+         return;
+       }
+
+      if (sym->attr.allocatable)
+       {
+         gfc_error("Allocatable function '%s' at %L must have an explicit "
+                   "function interface", sym->name, where);
+         return;
+       }
+
       for (a = *ap; a; a = a->next)
        {
          /* Skip g77 keyword extensions like %VAL, %REF, %LOC.  */
index a9e1645..4d432ef 100644 (file)
@@ -1,7 +1,13 @@
+2011-01-31  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/47042
+       * gfortran.dg/interface_34.f90: New.
+
 2011-01-30  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/47523
        * gfortran.dg/realloc_on_assign_5.f03: New test.
+       * gfortran.dg/realloc_on_assign_5.f03: New test.
 
 2011-01-29  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
 
diff --git a/gcc/testsuite/gfortran.dg/interface_34.f90 b/gcc/testsuite/gfortran.dg/interface_34.f90
new file mode 100644 (file)
index 0000000..3e409d5
--- /dev/null
@@ -0,0 +1,33 @@
+! { dg-compile }
+!
+! PR fortran/47042
+!
+! Contribued by Jerry DeLisle
+!
+
+program bug
+
+contains
+function get_cstring ()
+  character              :: get_cstring
+  character, pointer     :: ptmp
+  character, allocatable :: atmp
+
+  get_cstring = ptmp(i) ! { dg-error "must have an explicit function interface" }
+  get_cstring = atmp(i) ! { dg-error "must have an explicit function interface" }
+end function
+
+function get_cstring2 ()
+  EXTERNAL :: ptmp, atmp
+  character              :: get_cstring2
+  character, pointer     :: ptmp
+  character, allocatable :: atmp
+
+  get_cstring2 = atmp(i) ! { dg-error "must have an explicit function interface" }
+
+  ! The following is regarded as call to a procedure pointer,
+  ! which is in principle valid:
+  get_cstring2 = ptmp(i)
+end function
+
+end program