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