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

--- Comment #3 from Paul Thomas <pault at gcc dot gnu.org> ---
Following the allocation itself, we get:
        solver._data.dim[0].lbound = 1;
        solver._data.dim[0].ubound = 2;
        solver._data.dim[0].stride = 1;
        solver._data.offset = -1;
        solver._data.span = 64;
        {
          integer(kind=8) D.4532;
          integer(kind=8) D.4533;
          integer(kind=8) D.4534;
          struct solver_sparse_gpu_t * D.4535;

          D.4532 = solver._data.offset;
          D.4533 = solver._data.dim[0].lbound;
          D.4534 = solver._data.dim[0].ubound;
          D.4535 = &source.16;
          {
            integer(kind=8) S.20;

            S.20 = D.4533;
            while (1)
              {
                if (S.20 > D.4534) goto L.28;
                {
                  struct __vtype_solver_m_Solver_base_t * {ref-all} D.4537;

                  solver._vptr = (struct __vtype_solver_m_Solver_base_t *
{ref-all}) &__vtab_solver_m_Solver_sparse_gpu_t;
                  D.4537 = solver._vptr;
                  solver._vptr->_copy (D.4535, (struct solver_base_t *)
solver._data.data + (sizetype) ((S.20 + D.4532) * solver._vptr->_size));
                }
                S.20 = S.20 + 1;
              }
            L.28:;
          }
        }
        desc.17.dtype = {.elem_len=64, .rank=0, .type=5};
        desc.17.data = (void * restrict) &source.16.solver_gpu_t;
        desc.17.span = (integer(kind=8)) desc.17.dtype.elem_len;
        __final_solver_m_Solver_gpu_t (&desc.17, 64, 1);
        if ((complex(kind=4)[0:] * restrict) source.16.solver_gpu_t.x.data !=
0B)
          {
            __builtin_free ((void *) source.16.solver_gpu_t.x.data);
            (complex(kind=4)[0:] * restrict) source.16.solver_gpu_t.x.data =
0B;
          }

So there it is, writ large at the end. For some reason, gfc_trans_allocate
applies a default initializer and the finalizes and nulls the component.

Paul

Reply via email to