------- 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

Reply via email to