re PR fortran/40646 ([F03] array-valued procedure pointer components)

2009-07-13  Janus Weil  <janus@gcc.gnu.org>

	PR fortran/40646
	* module.c (mio_symbol): If the symbol has formal arguments,
	the formal namespace will be present.
	* resolve.c (resolve_actual_arglist): Correctly handle 'called'
	procedure pointer components as actual arguments.
	(resolve_fl_derived,resolve_symbol): Make sure the formal namespace
	is present.
	* trans-expr.c (gfc_conv_procedure_call): Correctly handle the formal
	arguments of procedure pointer components.


2009-07-13  Janus Weil  <janus@gcc.gnu.org>

	PR fortran/40646
	* gfortran.dg/proc_ptr_22.f90: Extended.
	* gfortran.dg/proc_ptr_comp_12.f90: Extended.

From-SVN: r149586
This commit is contained in:
Janus Weil 2009-07-13 15:41:37 +02:00
parent ae525aa88f
commit acbdc378b6
7 changed files with 56 additions and 14 deletions

View File

@ -1,3 +1,15 @@
2009-07-13 Janus Weil <janus@gcc.gnu.org>
PR fortran/40646
* module.c (mio_symbol): If the symbol has formal arguments,
the formal namespace will be present.
* resolve.c (resolve_actual_arglist): Correctly handle 'called'
procedure pointer components as actual arguments.
(resolve_fl_derived,resolve_symbol): Make sure the formal namespace
is present.
* trans-expr.c (gfc_conv_procedure_call): Correctly handle the formal
arguments of procedure pointer components.
2009-07-12 Tobias Burnus <burnus@net-b.de>
Philippe Marguinaud <philippe.marguinaud@meteo.fr>

View File

@ -3439,19 +3439,8 @@ mio_symbol (gfc_symbol *sym)
mio_symbol_attribute (&sym->attr);
mio_typespec (&sym->ts);
/* Contained procedures don't have formal namespaces. Instead we output the
procedure namespace. The will contain the formal arguments. */
if (iomode == IO_OUTPUT)
{
formal = sym->formal;
while (formal && !formal->sym)
formal = formal->next;
if (formal)
mio_namespace_ref (&formal->sym->ns);
else
mio_namespace_ref (&sym->formal_ns);
}
mio_namespace_ref (&sym->formal_ns);
else
{
mio_namespace_ref (&sym->formal_ns);

View File

@ -1239,7 +1239,14 @@ resolve_actual_arglist (gfc_actual_arglist *arg, procedure_type ptype,
if (gfc_is_proc_ptr_comp (e, &comp))
{
e->ts = comp->ts;
e->expr_type = EXPR_VARIABLE;
if (e->value.compcall.actual == NULL)
e->expr_type = EXPR_VARIABLE;
else
{
if (comp->as != NULL)
e->rank = comp->as->rank;
e->expr_type = EXPR_FUNCTION;
}
goto argument_list;
}
@ -8993,6 +9000,9 @@ ensure_not_abstract (gfc_symbol* sub, gfc_symbol* ancestor)
}
static void resolve_symbol (gfc_symbol *sym);
/* Resolve the components of a derived type. */
static gfc_try
@ -9031,6 +9041,9 @@ resolve_fl_derived (gfc_symbol *sym)
{
gfc_symbol *ifc = c->ts.interface;
if (ifc->formal && !ifc->formal_ns)
resolve_symbol (ifc);
if (ifc->attr.intrinsic)
resolve_intrinsic (ifc, &ifc->declared_at);
@ -9832,6 +9845,20 @@ resolve_symbol (gfc_symbol *sym)
if (sym->formal_ns && sym->formal_ns != gfc_current_ns)
gfc_resolve (sym->formal_ns);
/* Make sure the formal namespace is present. */
if (sym->formal && !sym->formal_ns)
{
gfc_formal_arglist *formal = sym->formal;
while (formal && !formal->sym)
formal = formal->next;
if (formal)
{
sym->formal_ns = formal->sym->ns;
sym->formal_ns->refs++;
}
}
/* Check threadprivate restrictions. */
if (sym->attr.threadprivate && !sym->attr.save && !sym->ns->save_all
&& (!sym->attr.in_common

View File

@ -2560,7 +2560,10 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
!= EXPR_CONSTANT)
|| (comp && comp->attr.dimension)
|| (!comp && sym->attr.dimension));
formal = sym->formal;
if (comp)
formal = comp->formal;
else
formal = sym->formal;
/* Evaluate the arguments. */
for (; arg != NULL; arg = arg->next, formal = formal ? formal->next : NULL)
{

View File

@ -1,3 +1,9 @@
2009-07-13 Janus Weil <janus@gcc.gnu.org>
PR fortran/40646
* gfortran.dg/proc_ptr_22.f90: Extended.
* gfortran.dg/proc_ptr_comp_12.f90: Extended.
2009-07-13 Ira Rosen <irar@il.ibm.com>
* gfortran.dg/vect/vect-6.f: New test.

View File

@ -7,6 +7,7 @@
module bugTestMod
implicit none
procedure(returnMat), pointer :: pp2
contains
function returnMat( a, b ) result( mat )
integer:: a, b
@ -21,6 +22,8 @@ program bugTest
procedure(returnMat), pointer :: pp
pp => returnMat
if (sum(pp(2,2))/=4) call abort()
pp2 => returnMat
if (sum(pp2(3,2))/=6) call abort()
end program bugTest
! { dg-final { cleanup-modules "bugTestMod" } }

View File

@ -27,6 +27,8 @@ program bugTest
testCatch = testObj%test(2,2)
print *,testCatch
if (sum(testCatch)/=4) call abort()
print *,testObj%test(3,3)
if (sum(testObj%test(3,3))/=9) call abort()
end program bugTest
! { dg-final { cleanup-modules "bugTestMod" } }