public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [Patch, Fortran, F03] PR 64508: interface check missing for procedure pointer component as actual argument
@ 2015-01-06 15:19 Janus Weil
  2015-01-11 11:40 ` Janus Weil
  0 siblings, 1 reply; 4+ messages in thread
From: Janus Weil @ 2015-01-06 15:19 UTC (permalink / raw)
  To: gfortran, gcc-patches

[-- Attachment #1: Type: text/plain, Size: 691 bytes --]

Hi all,

here is a patch which adds an interface check for procedure pointer
components as acual arguments. Such a check is there already for
ordinary procedures and procedure pointers, but missing for PPCs. It
checks the interface of the actual argument versus the interface of
the dummy procedure, according to the usual rules.

Regtested on x86_64-unknown-linux-gnu. Ok for trunk?

Cheers,
Janus



2015-01-06  Janus Weil  <janus@gcc.gnu.org>

    PR fortran/64508
    * interface.c (compare_parameter): Interface check for
    procedure-pointer component as actual argument.

2015-01-06  Janus Weil  <janus@gcc.gnu.org>

    PR fortran/64508
    * gfortran.dg/proc_ptr_comp_41.f90: New.

[-- Attachment #2: pr64508.diff --]
[-- Type: text/plain, Size: 1323 bytes --]

Index: gcc/fortran/interface.c
===================================================================
--- gcc/fortran/interface.c	(Revision 219261)
+++ gcc/fortran/interface.c	(Arbeitskopie)
@@ -1922,6 +1922,8 @@ compare_parameter (gfc_symbol *formal, gfc_expr *a
 {
   gfc_ref *ref;
   bool rank_check, is_pointer;
+  char err[200];
+  gfc_component *ppc;
 
   /* If the formal arg has type BT_VOID, it's to one of the iso_c_binding
      procs c_f_pointer or c_f_procpointer, and we need to accept most
@@ -1942,7 +1944,6 @@ compare_parameter (gfc_symbol *formal, gfc_expr *a
 
   if (actual->ts.type == BT_PROCEDURE)
     {
-      char err[200];
       gfc_symbol *act_sym = actual->symtree->n.sym;
 
       if (formal->attr.flavor != FL_PROCEDURE)
@@ -1976,6 +1977,19 @@ compare_parameter (gfc_symbol *formal, gfc_expr *a
       return 1;
     }
 
+  ppc = gfc_get_proc_ptr_comp (actual);
+  if (ppc)
+    {
+      if (!gfc_compare_interfaces (formal, ppc->ts.interface, ppc->name, 0, 1,
+				   err, sizeof(err), NULL, NULL))
+	{
+	  if (where)
+	    gfc_error ("Interface mismatch in dummy procedure %qs at %L: %s",
+		       formal->name, &actual->where, err);
+	  return 0;
+	}
+    }
+
   /* F2008, C1241.  */
   if (formal->attr.pointer && formal->attr.contiguous
       && !gfc_is_simply_contiguous (actual, true))

[-- Attachment #3: proc_ptr_comp_41.f90 --]
[-- Type: text/x-fortran, Size: 734 bytes --]

! { dg-do compile }
!
! PR 64508: [F03] interface check missing for procedure pointer component as actual argument
!
! Contributed by Janus Weil <janus@gcc.gnu.org>

  TYPE :: parent
  END TYPE

  TYPE, EXTENDS(parent) :: extension
    procedure(extension_proc), pointer :: ppc
  END TYPE

  CLASS(extension), ALLOCATABLE :: x
  CALL some_proc(x%ppc)               !  { dg-error "Interface mismatch in dummy procedure" }

contains

  SUBROUTINE parent_proc(arg)
    CLASS(parent), INTENT(IN) :: arg
  END SUBROUTINE

  SUBROUTINE extension_proc(arg)
    CLASS(extension), INTENT(IN) :: arg
  END SUBROUTINE


  SUBROUTINE some_proc(proc)
    PROCEDURE(parent_proc) :: proc
    TYPE(Parent) :: a
    CALL proc(a)
  END SUBROUTINE

end

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2015-01-11 17:33 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-01-06 15:19 [Patch, Fortran, F03] PR 64508: interface check missing for procedure pointer component as actual argument Janus Weil
2015-01-11 11:40 ` Janus Weil
2015-01-11 15:53   ` Paul Richard Thomas
2015-01-11 17:39     ` Janus Weil

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).