This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
Re: [Patch, Fortran, F03] PR 40870: include formal args in backend_decl of PPCs
Paul,
> Aahhh! ?That's because it's so good that it's invisible. ?For lesser
> mortals that can't deal with the latest technology, please find the
> diff attached.
I think your patch effectively does pretty much the same as mine (even
though mine lacks the invisibility mode ;), but your version is
probably safer against regressions, since it's guarded by an
additional check for derived->attr.proc_pointer_comp.
Btw, I found another minor flaw in my patch, concerning cases like
"procedure(integer), pointer, nopass".
Updated patch (based on Paul's version) is attached. Ok to commit
after another regtest?
Cheers,
Janus
2009-08-05 Janus Weil <janus@gcc.gnu.org>
Paul Thomas <pault@gcc.gnu.org>
PR fortran/40870
* trans-types.c (gfc_get_ppc_type): Include formal args in backend_decl
using the interface symbol.
(gfc_get_derived_type): Prevent infinite recursion loop
if a PPC has a derived-type formal arg.
2009-08-05 Janus Weil <janus@gcc.gnu.org>
Paul Thomas <pault@gcc.gnu.org>
PR fortran/40870
* gfortran.dg/proc_ptr_comp_13.f90: Extended.
> On Tue, Aug 4, 2009 at 3:17 PM, Janus Weil<janus@gcc.gnu.org> wrote:
>> 2009/8/4 Paul Richard Thomas <paul.richard.thomas@gmail.com>:
>>>> Well, in principle you're right: Usually one should test for
>>>> TYPE_FIELDS. However, in this case I think it's not possible, because
>>>> the fields have not been built yet. Here's an example:
>>>
>>> Indeed! ?That was the idea behind the modified patch that I attached.
>>
>> Sorry, I think the attachment was missing?!?
>>
>> Cheers,
>> Janus
Index: gcc/testsuite/gfortran.dg/proc_ptr_comp_13.f90
===================================================================
--- gcc/testsuite/gfortran.dg/proc_ptr_comp_13.f90 (revision 150455)
+++ gcc/testsuite/gfortran.dg/proc_ptr_comp_13.f90 (working copy)
@@ -1,6 +1,7 @@
! { dg-do run }
!
-! PR 40882: [F03] infinite recursion in gfc_get_derived_type with PPC returning derived type
+! PR 40882: [F03] infinite recursion in gfc_get_derived_type with PPC returning derived type.
+! At the same time, check that a formal argument does not cause infinite recursion (PR 40870).
!
! Contributed by Janus Weil <janus@gcc.gnu.org>
@@ -9,6 +10,7 @@ implicit none
type :: t
integer :: data
procedure(foo), pointer, nopass :: ppc
+ procedure(type(t)), pointer, nopass :: ppc2
end type
type(t) :: o,o2
@@ -16,7 +18,7 @@ type(t) :: o,o2
o%data = 1
o%ppc => foo
-o2 = o%ppc()
+o2 = o%ppc(o)
if (o%data /= 1) call abort()
if (o2%data /= 5) call abort()
@@ -25,9 +27,9 @@ if (associated(o2%ppc)) call abort()
contains
- function foo()
- type(t) :: foo
- foo%data = 5
+ function foo(arg)
+ type(t) :: foo, arg
+ foo%data = arg%data * 5
foo%ppc => NULL()
end function
Index: gcc/fortran/trans-types.c
===================================================================
--- gcc/fortran/trans-types.c (revision 150455)
+++ gcc/fortran/trans-types.c (working copy)
@@ -1895,16 +1895,16 @@ tree
gfc_get_ppc_type (gfc_component* c)
{
tree t;
+
+ /* Explicit interface. */
+ if (c->attr.if_source != IFSRC_UNKNOWN && c->ts.interface)
+ return build_pointer_type (gfc_get_function_type (c->ts.interface));
+
+ /* Implicit interface (only return value may be known). */
if (c->attr.function && !c->attr.dimension)
- {
- if (c->ts.type == BT_DERIVED)
- t = c->ts.derived->backend_decl;
- else
- t = gfc_typenode_for_spec (&c->ts);
- }
+ t = gfc_typenode_for_spec (&c->ts);
else
t = void_type_node;
- /* TODO: Build argument list. */
return build_pointer_type (build_function_type (t, NULL_TREE));
}
@@ -2012,8 +2012,11 @@ gfc_get_derived_type (gfc_symbol * deriv
components' backend_decl may have not been built. */
if (derived->backend_decl)
{
- /* Its components' backend_decl have been built. */
- if (TYPE_FIELDS (derived->backend_decl))
+ /* Its components' backend_decl have been built or we are
+ seeing recursion through the formal arglist of a procedure
+ pointer component. */
+ if (TYPE_FIELDS (derived->backend_decl)
+ || derived->attr.proc_pointer_comp)
return derived->backend_decl;
else
typenode = derived->backend_decl;
- References:
- [Patch, Fortran, F03] PR 40870: include formal args in backend_decl of PPCs
- Re: [Patch, Fortran, F03] PR 40870: include formal args in backend_decl of PPCs
- From: Paul Richard Thomas
- Re: [Patch, Fortran, F03] PR 40870: include formal args in backend_decl of PPCs
- Re: [Patch, Fortran, F03] PR 40870: include formal args in backend_decl of PPCs
- From: Paul Richard Thomas
- Re: [Patch, Fortran, F03] PR 40870: include formal args in backend_decl of PPCs
- Re: [Patch, Fortran, F03] PR 40870: include formal args in backend_decl of PPCs
- From: Paul Richard Thomas