]> gcc.gnu.org Git - gcc.git/commitdiff
re PR fortran/46067 ([F03] invalid procedure pointer assignment not detected)
authorJanus Weil <janus@gcc.gnu.org>
Thu, 21 Oct 2010 09:25:17 +0000 (11:25 +0200)
committerJanus Weil <janus@gcc.gnu.org>
Thu, 21 Oct 2010 09:25:17 +0000 (11:25 +0200)
2010-10-21  Janus Weil  <janus@gcc.gnu.org>

PR fortran/46067
* interface.c (gfc_compare_interfaces): Switch arguments of type
comparison (important for polymorphic variables).

2010-10-21  Janus Weil  <janus@gcc.gnu.org>

PR fortran/46067
* gfortran.dg/dummy_procedure_4.f90: New.
* gfortran.dg/proc_ptr_30.f90: New.

From-SVN: r165755

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

index 37f4b16ef8474121fb43c61c8d45259271e34b61..1bc4917f29e74bf13e13801b9bf6d8a62f04dbc0 100644 (file)
@@ -1,3 +1,9 @@
+2010-10-21  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/46067
+       * interface.c (gfc_compare_interfaces): Switch arguments of type
+       comparison (important for polymorphic variables).
+
 2010-10-21  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/46100
index cbe63cad01be76b65648840c5a668e0b6b475e0c..6ae36c2fb6a79d505d81cf9ce2416339fecab5ff 100644 (file)
@@ -1056,7 +1056,7 @@ gfc_compare_interfaces (gfc_symbol *s1, gfc_symbol *s2, const char *name2,
          }
 
        /* Check type and rank.  */
-       if (!compare_type_rank (f1->sym, f2->sym))
+       if (!compare_type_rank (f2->sym, f1->sym))
          {
            if (errmsg != NULL)
              snprintf (errmsg, err_len, "Type/rank mismatch in argument '%s'",
index e388ac152e4cdb9b0e354c84bf87f39981991a68..7d1dbb9dfefcb2ebf532e072d356f5d554a148f8 100644 (file)
@@ -1,3 +1,9 @@
+2010-10-21  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/46067
+       * gfortran.dg/dummy_procedure_4.f90: New.
+       * gfortran.dg/proc_ptr_30.f90: New.
+
 2010-10-21  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/46100
diff --git a/gcc/testsuite/gfortran.dg/dummy_procedure_4.f90 b/gcc/testsuite/gfortran.dg/dummy_procedure_4.f90
new file mode 100644 (file)
index 0000000..498685b
--- /dev/null
@@ -0,0 +1,48 @@
+! { dg-do compile }
+!
+! PR 46067: [F03] invalid procedure pointer assignment not detected
+!
+! Contributed by Janus Weil <janus@gcc.gnu.org>
+
+module m
+
+  type test_type
+    integer :: id = 1
+  end type
+
+contains
+
+  real function fun1 (t,x)
+    real, intent(in) :: x
+    type(test_type) :: t
+    print *," id = ", t%id
+    fun1 = cos(x)
+  end function
+
+end module
+
+
+  use m
+  implicit none
+
+  call test (fun1)  ! { dg-error "Interface mismatch in dummy procedure" }
+
+contains
+
+  subroutine test(proc)
+    interface
+      real function proc(t,x)
+        import :: test_type
+        real, intent(in) :: x
+        class(test_type) :: t
+      end function
+    end interface
+    type(test_type) :: funs
+    real :: r
+    r = proc(funs,0.)
+    print *, " proc(0) ",r
+  end subroutine
+
+end
+
+! { dg-final { cleanup-modules "m" } }
diff --git a/gcc/testsuite/gfortran.dg/proc_ptr_30.f90 b/gcc/testsuite/gfortran.dg/proc_ptr_30.f90
new file mode 100644 (file)
index 0000000..5996dee
--- /dev/null
@@ -0,0 +1,38 @@
+! { dg-do compile }
+!
+! PR 46067: [F03] invalid procedure pointer assignment not detected
+!
+! Contributed by Stephen J. Bespalko <sjbespa@comcast.net>
+
+  implicit none
+  
+  type test_type
+    integer :: id = 1
+  end type
+  
+  abstract interface
+    real function fun_interface(t,x)
+      import :: test_type
+      real, intent(in) :: x
+      class(test_type) :: t
+    end function
+  end interface  
+  
+  type(test_type) :: funs
+  real :: r
+  procedure(fun_interface), pointer :: pp
+
+  pp => fun1        ! { dg-error "Interface mismatch in procedure pointer assignment" }
+  r = pp(funs,0.)
+  print *, " pp(0) ", r 
+
+contains
+
+  real function fun1 (t,x)
+    real, intent(in) :: x
+    type(test_type) :: t
+    print *," id = ", t%id
+    fun1 = cos(x)
+  end function
+end
This page took 0.112061 seconds and 5 git commands to generate.