https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116388
Paul Thomas <pault at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Ever confirmed|0 |1
Last reconfirmed| |2024-11-03
CC| |pault at gcc dot gnu.org
--- Comment #2 from Paul Thomas <pault at gcc dot gnu.org> ---
> One hacky "fix" is to give the temporary a leading underscore, thus avoiding
> finalization altogether:
> --- a/gcc/fortran/class.cc
> +++ b/gcc/fortran/class.cc
> @@ -1152,7 +1152,7 @@ finalize_component (gfc_expr *expr, gfc_symbol
> *derived, gfc_component *comp,
> gcc_assert (c);
>
> /* Set scalar argument for storage_size. */
> - gfc_get_symbol ("comp_byte_stride", sub_ns, &byte_stride);
> + gfc_get_symbol ("_comp_byte_stride", sub_ns, &byte_stride);
> byte_stride->ts = e->ts;
> byte_stride->attr.flavor = FL_VARIABLE;
> byte_stride->attr.value = 1;
>
> This regtests cleanly on current trunk and seems to fix the issue. However,
> since I'm only taking first baby steps in gfortran development, I have no
> clue what the significance of the leading underscore is and what sort of
> other side effects this change could have.
>
I consider this to be a perfectly acceptable fix, since (1) it works and (2)
comp_byte_stride has no business being finalized! With this fix in place,
gfortran gives the same result as ifort.
Do you want to apply the fix or shall I do the honours?
Your testcase exposes another gfortran bug, by the way! The lines 'write(*,*)
"B:", self%cptr' are invalid because, as ifort puts it, "A derived-type object
in an input/output list cannot have inaccessible components unless a suitable
user-defined input/output procedure is available." The correct workaround is:
if (.not. self%cptr_invalid) write(*,*) "A:", transfer (self%cptr,
C_LONG_LONG). This is now pr117430.
Paul