https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81758

--- Comment #14 from Paul Thomas <pault at gcc dot gnu.org> ---
The chunk of offending code:
         val_p=>NULL(); cep=>NULL()
         cep=>this%element(offset,errc)
         if(errc.eq.GFC_SUCCESS.and.associated(cep)) then
          val_p=>cep%get_value(errc)

is translated to:

  val_p._vptr = (struct __vtype__STAR * {ref-all}) &__vtab__STAR;
  val_p._len = 0;
  val_p._data = 0B;
  cep._vptr = (struct __vtype_gfc_base_Gfc_cont_elem_t * {ref-all})
&__vtab_gfc_base_Gfc_cont_elem_t;
  cep._data = 0B;
  {
    struct __class_gfc_base_Gfc_cont_elem_t_p rhs.69;

    rhs.69 = this->_vptr->element ((struct __class_gfc_vector_Vector_iter_t_t
*) this, (integer(kind=8) *) offset, &errc);
    cep._vptr = rhs.69._vptr;
    cep._data = rhs.69._data;
  }
  if ((logical(kind=4)) (errc == 0 && cep._data != 0B))
    {
      {
        struct __class_gfc_base_Gfc_cont_elem_t_t this.70;
        struct __class__STAR_p rhs.71;

        this.70 = VIEW_CONVERT_EXPR<struct
__class_gfc_base_Gfc_cont_elem_t_t>(cep);
        rhs.71 = cep._vptr->get_value (&this.70, &errc);
        val_p._vptr = rhs.71._vptr;
        val_p._len = 0;
        val_p._data = rhs.71._data;
      }
    }

Now if I change          class(gfc_cont_elem_t), pointer:: cep
to                       type(gfc_cont_elem_t), pointer:: cep

The code runs correctly - well, all the tests pass and there is no segfault :-)

From the NULLing of cep, the code becomes:

  cep = 0B;
  {
    struct __class_gfc_base_Gfc_cont_elem_t_p D.4458;

    D.4458 = this->_vptr->element ((struct __class_gfc_vector_Vector_iter_t_t
*) this, (integer(kind=8) *) offset, &errc);
    cep = D.4458._data;
  }
  if ((logical(kind=4)) (errc == 0 && cep != 0B))
    {
      {
        struct __class_gfc_base_Gfc_cont_elem_t_t class.69;
        struct __class__STAR_p rhs.70;

        class.69._vptr = (struct __vtype_gfc_base_Gfc_cont_elem_t * {ref-all})
&__vtab_gfc_base_Gfc_cont_elem_t;
        class.69._data = cep;
        rhs.70 = contelemgetvalue (&class.69, &errc);
        val_p._vptr = rhs.70._vptr;
        val_p._len = 0;
        val_p._data = rhs.70._data;
      }

This corresponds to trans_class_vptr_len_assignment NOT being called. I am
rather sure that there is some failure of logic in it.

Paul

Reply via email to