http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56261



--- Comment #5 from janus at gcc dot gnu.org 2013-02-09 10:17:16 UTC ---

One can play the same game with scalars, where the situation is even more

severe:



module t



  type :: nc

     integer :: n = 1

  end type nc



contains



  subroutine ff(self)

    implicit none

    class(nc), intent(in) :: self

    write (0,*) '  --> content of self%n) is ',self%n

  end subroutine



end module t



program p

  use t

  implicit none

  type    (nc) :: c

  procedure(), pointer                   :: f => ff



  call ff(c)

  call f(c)



end program p





The dump shows:



  {

    struct __class_t_Nc class.1;



    class.1._vptr = (struct __vtype_t_Nc * {ref-all}) &__vtab_t_Nc;

    class.1._data = &c;

    ff (&class.1);

  }

  f (&c);



i.e. we set up a polymorphic temporary for the 'ff' call, which we don't do for

'f' since we don't know that it expects a CLASS argument.



Fixing this for the array case would be possible, if we just use the

'polymorphic' version of the array descriptor everywhere.



In the scalar case, we would have to set up a class container, for every call

to a procedure pointer without interface, which is passed a TYPE or CLASS

argument. This would then in turn mean we have to wrap the argument of the

original function 'ff' in a class container, even if it is TYPE. AFAICS, this

could even mean we need an class container (or array descriptor) for *every*

TYPE(t) variable, which would be a rather dramatic change in implementation

(and in principle also affects pure F95 code).



I sincerely hope that all the test cases in this PR are invalud. One should

check the standard!



Btw, do other compilers handle this stuff?

Reply via email to