[Patch, Fortran] PR42045: [F03] passing a procedure pointer component to a procedure pointer dummy

View: New views
3 Messages — Rating Filter:   Alert me  

[Patch, Fortran] PR42045: [F03] passing a procedure pointer component to a procedure pointer dummy

by Janus Weil-3 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi all,

this patch fixes some trouble with PPCs which have no interface [i.e.
"procedure()"]. Up to now, what we did with these was to apply
implicit typing. However, Malcolm Cohen's draft answer to an
interpretation request by Tobias
(http://www.j3-fortran.org/doc/year/09/09-236r1.txt) states that PPCs
should never be implicitly typed. Due to this reasoning, a PPC without
explicit interface specification can only be a subroutine pointer (and
not a function pointer).

The patch also fixes the problem that John McFarland reported (which
was caused by the implicit typing of PPCs). It was regtested
successfully on x86_64-unknown-linux-gnu. Ok for trunk?

Cheers,
Janus


2009-11-21  Janus Weil  <janus@...>

        PR fortran/42045
        * resolve.c (resolve_actual_arglist): Make sure procedure pointer
        actual arguments are resolved correctly.
        (resolve_function): An EXPR_FUNCTION which is a procedure pointer
        component, has already been resolved.
        (resolve_fl_derived): Procedure pointer components should not be
        implicitly typed.

2009-11-21  Janus Weil  <janus@...>

        PR fortran/42045
        * gfortran.dg/proc_ptr_comp_2.f90: Correct invalid test case.
        * gfortran.dg/proc_ptr_comp_3.f90: Extended test case.
        * gfortran.dg/proc_ptr_comp_24.f90: New.

[pr42045.diff]

Index: gcc/testsuite/gfortran.dg/proc_ptr_comp_2.f90
===================================================================
--- gcc/testsuite/gfortran.dg/proc_ptr_comp_2.f90 (revision 154409)
+++ gcc/testsuite/gfortran.dg/proc_ptr_comp_2.f90 (working copy)
@@ -9,7 +9,6 @@
   type t
     procedure(fcn), pointer, nopass :: ppc
     procedure(abstr), pointer, nopass :: ppc1
-    procedure(), nopass, pointer:: iptr3
     integer :: i
   end type
 
@@ -43,11 +42,6 @@
   if (base/=12) call abort
   call foo (f,7)
 
-! Check with implicit interface
-  obj%iptr3 => iabs
-  base=obj%iptr3(-9)
-  if (base/=9) call abort
-
 contains
 
   integer function fcn(x)
Index: gcc/testsuite/gfortran.dg/proc_ptr_comp_3.f90
===================================================================
--- gcc/testsuite/gfortran.dg/proc_ptr_comp_3.f90 (revision 154409)
+++ gcc/testsuite/gfortran.dg/proc_ptr_comp_3.f90 (working copy)
@@ -16,6 +16,7 @@ end interface
 external :: aaargh
 
 type :: t
+  procedure(), pointer, nopass :: ptr1
   procedure(real), pointer, nopass :: ptr2
   procedure(sub), pointer, nopass :: ptr3
   procedure(), pointer, nopass ptr4              ! { dg-error "Expected '::'" }
@@ -40,6 +41,7 @@ x%ptr2 => x       ! { dg-error "Invalid procedure
 
 x => x%ptr2       ! { dg-error "Pointer assignment to non-POINTER" }
 
+print *, x%ptr1() ! { dg-error "attribute conflicts with" }
 call x%ptr2()     ! { dg-error "attribute conflicts with" }
 print *,x%ptr3()  ! { dg-error "attribute conflicts with" }
 
Index: gcc/fortran/resolve.c
===================================================================
--- gcc/fortran/resolve.c (revision 154409)
+++ gcc/fortran/resolve.c (working copy)
@@ -1321,6 +1321,8 @@ resolve_actual_arglist (gfc_actual_arglist *arg, p
  e->rank = comp->as->rank;
       e->expr_type = EXPR_FUNCTION;
     }
+  if (gfc_resolve_expr (e) == FAILURE)                          
+    return FAILURE;
   goto argument_list;
  }
 
@@ -2519,6 +2521,10 @@ resolve_function (gfc_expr *expr)
   if (expr->symtree)
     sym = expr->symtree->n.sym;
 
+  /* If this is a procedure pointer component, it has already been resolved.  */
+  if (gfc_is_proc_ptr_comp (expr, NULL))
+    return SUCCESS;
+  
   if (sym && sym->attr.intrinsic
       && resolve_intrinsic (sym, &expr->where) == FAILURE)
     return FAILURE;
@@ -10219,8 +10225,9 @@ resolve_fl_derived (gfc_symbol *sym)
  }
       else if (c->attr.proc_pointer && c->ts.type == BT_UNKNOWN)
  {
-  c->ts = *gfc_get_default_type (c->name, NULL);
-  c->attr.implicit_type = 1;
+  /* Since PPCs are not implicitly typed, a PPC without an explicit
+     interface must be a subroutine.  */
+  gfc_add_subroutine (&c->attr, c->name, &c->loc);
  }
 
       /* Procedure pointer components: Check PASS arg.  */



proc_ptr_comp_24.f90 (906 bytes) Download Attachment

Re: [Patch, Fortran] PR42045: [F03] passing a procedure pointer component to a procedure pointer dummy

by Tobias Burnus :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Janus Weil wrote:
> The patch also fixes the problem that John McFarland reported (which
> was caused by the implicit typing of PPCs). It was regtested
> successfully on x86_64-unknown-linux-gnu. Ok for trunk?
>  
OK. Thanks for the patch!

Tobias

> 2009-11-21  Janus Weil  <janus@...>
>
> PR fortran/42045
> * resolve.c (resolve_actual_arglist): Make sure procedure pointer
> actual arguments are resolved correctly.
> (resolve_function): An EXPR_FUNCTION which is a procedure pointer
> component, has already been resolved.
> (resolve_fl_derived): Procedure pointer components should not be
> implicitly typed.
>
> 2009-11-21  Janus Weil  <janus@...>
>
> PR fortran/42045
> * gfortran.dg/proc_ptr_comp_2.f90: Correct invalid test case.
> * gfortran.dg/proc_ptr_comp_3.f90: Extended test case.
> * gfortran.dg/proc_ptr_comp_24.f90: New.
>  


Re: [Patch, Fortran] PR42045: [F03] passing a procedure pointer component to a procedure pointer dummy

by Janus Weil-3 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

>> The patch also fixes the problem that John McFarland reported (which
>> was caused by the implicit typing of PPCs). It was regtested
>> successfully on x86_64-unknown-linux-gnu. Ok for trunk?
>>
> OK. Thanks for the patch!

Thanks. Committed as r154492.

Cheers,
Janus


>> 2009-11-21  Janus Weil  <janus@...>
>>
>>       PR fortran/42045
>>       * resolve.c (resolve_actual_arglist): Make sure procedure pointer
>>       actual arguments are resolved correctly.
>>       (resolve_function): An EXPR_FUNCTION which is a procedure pointer
>>       component, has already been resolved.
>>       (resolve_fl_derived): Procedure pointer components should not be
>>       implicitly typed.
>>
>> 2009-11-21  Janus Weil  <janus@...>
>>
>>       PR fortran/42045
>>       * gfortran.dg/proc_ptr_comp_2.f90: Correct invalid test case.
>>       * gfortran.dg/proc_ptr_comp_3.f90: Extended test case.
>>       * gfortran.dg/proc_ptr_comp_24.f90: New.
>>
>
>