------- Comment #4 from paul dot richard dot thomas at cea dot fr 2006-07-12
11:54 -------
Tobias,
I am so glad to see that somebody is passing components of derived type arrays;
I bust myself to make that work! Anyway, I partially broke it with a recent
patch - sorry.
Reduced testcase:
SUBROUTINE mpi_bc_all(lda_u, ntypd)
TYPE t_utype
INTEGER l
END TYPE t_utype
TYPE (t_utype), INTENT (INOUT) :: lda_u(ntypd)
EXTERNAL MPI_BCAST
CALL MPI_BCAST(lda_u(:)%l) ! No explicit interface -> no fsym -> segfault
END SUBROUTINE mpi_bc_all
A work around is to add an interface:
interface
subroutine MPI_BCAST (i)
integer, dimension (:) :: i
end subroutine MPI_BCAST
end interface
Here is a patch that works. It is not regtested but I am sure that it is
bombproof. I will do all the regtesting tonight and commit it as "obvious"
tomorrow morning.
Patch:
Index: gcc/fortran/trans-expr.c
===================================================================
--- gcc/fortran/trans-expr.c (r├®vision 115306)
+++ gcc/fortran/trans-expr.c (copie de travail)
@@ -1980,7 +1980,8 @@
array of derived types. In this case, the argument
is converted to a temporary, which is passed and then
written back after the procedure call. */
- gfc_conv_aliased_arg (&parmse, e, f, fsym->attr.intent);
+ gfc_conv_aliased_arg (&parmse, e, f,
+ fsym ? fsym->attr.intent : INTENT_INOUT);
else
gfc_conv_array_parameter (&parmse, e, argss, f);
Paul
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28353