public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug fortran/106576] New: Finalization of temporaries from functions not occuring
@ 2022-08-10 7:45 tkoenig at gcc dot gnu.org
2022-08-10 16:50 ` [Bug fortran/106576] " tkoenig at gcc dot gnu.org
` (8 more replies)
0 siblings, 9 replies; 10+ messages in thread
From: tkoenig at gcc dot gnu.org @ 2022-08-10 7:45 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106576
Bug ID: 106576
Summary: Finalization of temporaries from functions not
occuring
Product: gcc
Version: 13.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
Assignee: unassigned at gcc dot gnu.org
Reporter: tkoenig at gcc dot gnu.org
Target Milestone: ---
Test case:
$ cat g2.f90
module y
implicit none
type foo
integer :: n
contains
final :: cleanup
end type foo
interface assignment (=)
module procedure assign
end interface assignment (=)
contains
subroutine assign (rop, op)
type(foo), intent(inout) :: rop
type(foo), intent(in) :: op
rop%n = op%n + 1
print '(A12,I3)',"assign", rop%n
end subroutine assign
function to_foo(n) result(res)
integer, intent(in) :: n
type (foo) :: res
res%n = n
print '(A12,I3)', "to_foo", res%n
end function to_foo
subroutine cleanup (self)
type (foo), intent(inout) :: self
print '(A12,I3)', "cleanup", self%n
end subroutine cleanup
end module y
program memain
use y
implicit none
call chk
contains
subroutine chk
type (foo) :: a
a = to_foo(3)
end subroutine chk
end program memain
$ gfortran g2.f90 && ./a.out
to_foo 3
assign 4
cleanup 4
$ nagfor g2.f90 && ./a.out
NAG Fortran Compiler Release 7.1(Hanzomon) Build 7101
[NAG Fortran Compiler normal termination]
to_foo 3
assign 4
cleanup 3
cleanup 4
NAG is in fact correct, the temporary from the function results should also
be finalized.
This actually blocks my little FMPFR library, so I might have a stab
at this myself.
^ permalink raw reply [flat|nested] 10+ messages in thread
* [Bug fortran/106576] Finalization of temporaries from functions not occuring
2022-08-10 7:45 [Bug fortran/106576] New: Finalization of temporaries from functions not occuring tkoenig at gcc dot gnu.org
@ 2022-08-10 16:50 ` tkoenig at gcc dot gnu.org
2022-08-13 16:09 ` tkoenig at gcc dot gnu.org
` (7 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: tkoenig at gcc dot gnu.org @ 2022-08-10 16:50 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106576
--- Comment #1 from Thomas Koenig <tkoenig at gcc dot gnu.org> ---
There currently is a c.l.f. thread on this, with this test case.
Although what nagfor and xlf are doing makes sense, it does
not (to me) follow from the language of the standard.
https://groups.google.com/g/comp.lang.fortran/c/7bB13FEa10w is
the link to the thread.
^ permalink raw reply [flat|nested] 10+ messages in thread
* [Bug fortran/106576] Finalization of temporaries from functions not occuring
2022-08-10 7:45 [Bug fortran/106576] New: Finalization of temporaries from functions not occuring tkoenig at gcc dot gnu.org
2022-08-10 16:50 ` [Bug fortran/106576] " tkoenig at gcc dot gnu.org
@ 2022-08-13 16:09 ` tkoenig at gcc dot gnu.org
2022-11-12 15:55 ` tkoenig at gcc dot gnu.org
` (6 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: tkoenig at gcc dot gnu.org @ 2022-08-13 16:09 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106576
Thomas Koenig <tkoenig at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Ever confirmed|0 |1
Assignee|unassigned at gcc dot gnu.org |tkoenig at gcc dot gnu.org
Last reconfirmed| |2022-08-13
Status|UNCONFIRMED |ASSIGNED
--- Comment #2 from Thomas Koenig <tkoenig at gcc dot gnu.org> ---
Created attachment 53451
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=53451&action=edit
Concept patch to show where stuff can be added (finding the cases only)
Here's a raw concept patch which shows (via fprintf) where the work could
be done. The idea is to look at the statement (and nothing else) and
then create a finalization block around it if there is something to
finalize. When creating the temporary with gfc_create_var, it probably would
make sense to add it to the symbols of the block as well and add it to
the routines to be finalized.
How does that sound?
^ permalink raw reply [flat|nested] 10+ messages in thread
* [Bug fortran/106576] Finalization of temporaries from functions not occuring
2022-08-10 7:45 [Bug fortran/106576] New: Finalization of temporaries from functions not occuring tkoenig at gcc dot gnu.org
2022-08-10 16:50 ` [Bug fortran/106576] " tkoenig at gcc dot gnu.org
2022-08-13 16:09 ` tkoenig at gcc dot gnu.org
@ 2022-11-12 15:55 ` tkoenig at gcc dot gnu.org
2022-11-28 15:11 ` pault at gcc dot gnu.org
` (5 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: tkoenig at gcc dot gnu.org @ 2022-11-12 15:55 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106576
Thomas Koenig <tkoenig at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|ASSIGNED |NEW
--- Comment #3 from Thomas Koenig <tkoenig at gcc dot gnu.org> ---
No time to work on this at the moment.
^ permalink raw reply [flat|nested] 10+ messages in thread
* [Bug fortran/106576] Finalization of temporaries from functions not occuring
2022-08-10 7:45 [Bug fortran/106576] New: Finalization of temporaries from functions not occuring tkoenig at gcc dot gnu.org
` (2 preceding siblings ...)
2022-11-12 15:55 ` tkoenig at gcc dot gnu.org
@ 2022-11-28 15:11 ` pault at gcc dot gnu.org
2022-11-28 15:12 ` pault at gcc dot gnu.org
` (4 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: pault at gcc dot gnu.org @ 2022-11-28 15:11 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106576
--- Comment #4 from Paul Thomas <pault at gcc dot gnu.org> ---
Created attachment 53977
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=53977&action=edit
Ongoing patch for PR37336
Fixes this PR, so testcase will be added to the collection.
Paul
^ permalink raw reply [flat|nested] 10+ messages in thread
* [Bug fortran/106576] Finalization of temporaries from functions not occuring
2022-08-10 7:45 [Bug fortran/106576] New: Finalization of temporaries from functions not occuring tkoenig at gcc dot gnu.org
` (3 preceding siblings ...)
2022-11-28 15:11 ` pault at gcc dot gnu.org
@ 2022-11-28 15:12 ` pault at gcc dot gnu.org
2022-12-04 17:27 ` tkoenig at gcc dot gnu.org
` (3 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: pault at gcc dot gnu.org @ 2022-11-28 15:12 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106576
--- Comment #5 from Paul Thomas <pault at gcc dot gnu.org> ---
Hi Thomas,
I hope that you are well and that the lack of time is for a good cause?
I have just returned to my finalizer patch. With it applied, your testcase
produces the same output as NAG.
I will attach the present version of the patch to this PR.
Cheers
Paul
^ permalink raw reply [flat|nested] 10+ messages in thread
* [Bug fortran/106576] Finalization of temporaries from functions not occuring
2022-08-10 7:45 [Bug fortran/106576] New: Finalization of temporaries from functions not occuring tkoenig at gcc dot gnu.org
` (4 preceding siblings ...)
2022-11-28 15:12 ` pault at gcc dot gnu.org
@ 2022-12-04 17:27 ` tkoenig at gcc dot gnu.org
2022-12-06 6:12 ` pault at gcc dot gnu.org
` (2 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: tkoenig at gcc dot gnu.org @ 2022-12-04 17:27 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106576
--- Comment #6 from Thomas Koenig <tkoenig at gcc dot gnu.org> ---
> I hope that you are well and that the lack of time is for a good cause?
Hi Paul,
yes, I'm well, and the lack of time is indeed for a good cause :-)
> I have just returned to my finalizer patch. With it applied, your testcase
> produces the same output as NAG.
That's great!
> I will attach the present version of the patch to this PR.
Is there a chance that we will see this patch in gcc13? Even if it
does not fix every last bug in finalizers in gfortran, it would still
be a very large improvement compared to the current condition.
^ permalink raw reply [flat|nested] 10+ messages in thread
* [Bug fortran/106576] Finalization of temporaries from functions not occuring
2022-08-10 7:45 [Bug fortran/106576] New: Finalization of temporaries from functions not occuring tkoenig at gcc dot gnu.org
` (5 preceding siblings ...)
2022-12-04 17:27 ` tkoenig at gcc dot gnu.org
@ 2022-12-06 6:12 ` pault at gcc dot gnu.org
2023-03-18 7:56 ` cvs-commit at gcc dot gnu.org
2023-03-18 17:34 ` pault at gcc dot gnu.org
8 siblings, 0 replies; 10+ messages in thread
From: pault at gcc dot gnu.org @ 2022-12-06 6:12 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106576
--- Comment #7 from Paul Thomas <pault at gcc dot gnu.org> ---
(In reply to Thomas Koenig from comment #6)
>
> > I hope that you are well and that the lack of time is for a good cause?
>
> Hi Paul,
>
> yes, I'm well, and the lack of time is indeed for a good cause :-)
>
> > I have just returned to my finalizer patch. With it applied, your testcase
> > produces the same output as NAG.
>
> That's great!
>
> > I will attach the present version of the patch to this PR.
>
> Is there a chance that we will see this patch in gcc13? Even if it
> does not fix every last bug in finalizers in gfortran, it would still
> be a very large improvement compared to the current condition.
Hi Thomas,
It's good to hear from you. I hope to submit the patches before Christmas. I am
working on some final wrinkles and testcases. I am still intensely busy on the
daytime job, which is something of a blocker.
Regards
Paul
^ permalink raw reply [flat|nested] 10+ messages in thread
* [Bug fortran/106576] Finalization of temporaries from functions not occuring
2022-08-10 7:45 [Bug fortran/106576] New: Finalization of temporaries from functions not occuring tkoenig at gcc dot gnu.org
` (6 preceding siblings ...)
2022-12-06 6:12 ` pault at gcc dot gnu.org
@ 2023-03-18 7:56 ` cvs-commit at gcc dot gnu.org
2023-03-18 17:34 ` pault at gcc dot gnu.org
8 siblings, 0 replies; 10+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2023-03-18 7:56 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106576
--- Comment #8 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Paul Thomas <pault@gcc.gnu.org>:
https://gcc.gnu.org/g:d7caf313525a46f200d7f5db1ba893f853774aee
commit r13-6747-gd7caf313525a46f200d7f5db1ba893f853774aee
Author: Paul Thomas <pault@gcc.gnu.org>
Date: Sat Mar 18 07:56:23 2023 +0000
Fortran: Fix bugs and missing features in finalization [PR37336]
2023-03-18 Paul Thomas <pault@gcc.gnu.org>
gcc/fortran
PR fortran/103854
PR fortran/96122
PR fortran/37336
* class.cc (finalize_component): Include the missing arguments
in the call to the component's finalizer wrapper.
(has_finalizer_component): Do not return true for procedure
pointer components.
(finalizer_insert_packed_call): Remove the redundant argument
in the call to the final subroutine.
(generate_finalization_wrapper): Add support for assumed rank
finalizers.
(gfc_may_be_finalized): New helper function.
* dump-parse-tree.cc (write_proc): Whitespace.
* gfortran.h : Add prototype for gfc_may_be_finalized.
* resolve.cc (resolve_function): Correct derived types that
have an incomplete namespace.
(resolve_where, gfc_resolve_where_code_in_forall,
gfc_resolve_forall_body, gfc_resolve_code): Check that the op
code is still EXEC_ASSIGN. If it is set lhs to must finalize.
(is_finalizable_type): New function.
(generate_component_assignments): Set must_finalize if needed.
(gfc_resolve_finalizers): Error if assumed rank finalizer is
not the only one. Warning on lack of scalar finalizer modified
to account for assumed rank finalizers.
(generate_final_call): New function.
(generate_component_assignments): Enclose the outermost call in
a block to capture automatic deallocation and final calls.
Set must_finalize as required to satisfy the standards. Use an
explicit pointer assignment for pointer components to capture
finalization of the target. Likewise use explicit assignment
for allocatable components. Do not use the temporary copy of
the lhs in defined assignment if the component is allocatable.
Put the temporary in the same namespace as the lhs symbol if
the component may be finalized. Remove the leading assignment
from the expansion of assignment of components that have their
own defined assignment components. Suppress finalization of
assignment of temporary components to the lhs. Make an explicit
final call for the rhs function temporary if it exists.
(gfc_resolve_code): Set must_finalize for assignments with an
array constructor on the rhs.
(gfc_resolve_finalizers): Ensure that an assumed rank finalizer
is the only finalizer for that type and correct the surprising
warning for the lack of a scalar finalizer.
(check_defined_assignments): Handle allocatable components.
(resolve_fl_derived): Set referenced the vtab for use
associated symbols.
(resolve_symbol): Set referenced an unreferenced symbol that
will be finalized.
* trans-array.cc (gfc_trans_array_constructor_value): Add code
to finalize the constructor result. Warn that this feature was
removed in F2018 and that it is suppressed by -std=2018.
(trans_array_constructor): Add finalblock, pass to previous
and apply to loop->post if filled.
(gfc_add_loop_ss_code): Add se finalblock to outer loop post.
(gfc_trans_array_cobounds, gfc_trans_array_bounds): Add any
generated finalization code to the main block.
(structure_alloc_comps): Add boolean argument to suppress
finalization and use it for calls from
gfc_deallocate_alloc_comp_no_caf. Otherwise it defaults to
false.
(gfc_copy_alloc_comp_no_fini): New wrapper for
structure_alloc_comps.
(gfc_alloc_allocatable_for_assignment): Suppress finalization
by setting new arg in call to gfc_deallocate_alloc_comp_no_caf.
(gfc_trans_deferred_array): Use gfc_may_be_finalized and do not
deallocate the components of entities with a leading '_' in the
name that are also marked as artificial.
* trans-array.h : Add the new boolean argument to the prototype
of gfc_deallocate_alloc_comp_no_caf with a default of false.
Add prototype for gfc_copy_alloc_comp_no_fini.
* trans-decl.cc(init_intent_out_dt): Tidy up the code.
* trans-expr.cc (gfc_init_se): Initialize finalblock.
(gfc_conv_procedure_call): Use gfc_finalize_tree_expr to
finalize function results. Replace in-line block for class
results with call to new function.
(gfc_conv_expr): Finalize structure constructors for F2003 and
F2008. Warn that this feature was deleted in F2018 and, unlike
array constructors, is not default. Add array constructor
finalblock to the post block.
(gfc_trans_scalar_assign): Suppress finalization by setting new
argument in call to gfc_deallocate_alloc_comp_no_caf. Add the
finalization blocks to the main block.
(gfc_trans_arrayfunc_assign): Use gfc_assignment_finalizer_call
and ensure that finalization occurs after the evaluation of the
rhs but using the initial value for the lhs. Finalize rhs
function results using gfc_finalize_tree_expr.
(trans_class_assignment, gfc_trans_assignment_1): As previous
function, taking care to order evaluation, assignment and
finalization correctly.
* trans-io.cc (gfc_trans_transfer): Add the final block.
* trans-stmt.cc (gfc_trans_call, gfc_trans_allocate): likewise.
(trans_associate_var): Nullify derived allocatable components
and finalize function targets with defined assignment
components on leaving the block scope.
(trans_allocate): Finalize source expressions, if required,
and set init_expr artificial temporarily to suppress the
finalization in gfc_trans_assignment.
* trans.cc (gfc_add_finalizer_call): Do not finalize the
temporaries generated in type assignment with defined
assignment components.
(gfc_assignment_finalizer_call): New function.
(gfc_finalize_tree_expr): New function.
* trans.h: Add finalblock to gfc_se. Add the prototypes for
gfc_finalize_tree_expr and gfc_assignment_finalizer_call.
gcc/testsuite/
PR fortran/64290
* gfortran.dg/finalize_38.f90 : New test.
* gfortran.dg/finalize_38a.f90 : New test.
* gfortran.dg/allocate_with_source_25.f90 : The number of final
calls goes down from 6 to 4.
* gfortran.dg/associate_25.f90 : Remove the incorrect comment.
* gfortran.dg/auto_dealloc_2.f90 : Change the tree dump expr
but the final count remains the same.
* gfortran.dg/unlimited_polymorphic_8.f90 : Tree dump reveals
foo.1.x rather than foo.0.x
PR fortran/67444
* gfortran.dg/finalize_39.f90 : New test.
PR fortran/67471
* gfortran.dg/finalize_40.f90 : New test.
PR fortran/69298
PR fortran/70863
* gfortran.dg/finalize_41.f90 : New test.
PR fortran/71798
* gfortran.dg/finalize_42.f90 : New test.
PR fortran/80524
* gfortran.dg/finalize_43.f90 : New test.
PR fortran/82996
* gfortran.dg/finalize_44.f90 : New test.
PR fortran/84472
* gfortran.dg/finalize_45.f90 : New test.
PR fortran/88735
PR fortran/93691
* gfortran.dg/finalize_46.f90 : New test.
PR fortran/91316
* gfortran.dg/finalize_47.f90 : New test.
PR fortran/106576
* gfortran.dg/finalize_48.f90 : New test.
PR fortran/37336
* gfortran.dg/finalize_49.f90 : New test.
* gfortran.dg/finalize_50.f90 : New test.
* gfortran.dg/finalize_51.f90 : New test.
^ permalink raw reply [flat|nested] 10+ messages in thread
* [Bug fortran/106576] Finalization of temporaries from functions not occuring
2022-08-10 7:45 [Bug fortran/106576] New: Finalization of temporaries from functions not occuring tkoenig at gcc dot gnu.org
` (7 preceding siblings ...)
2023-03-18 7:56 ` cvs-commit at gcc dot gnu.org
@ 2023-03-18 17:34 ` pault at gcc dot gnu.org
8 siblings, 0 replies; 10+ messages in thread
From: pault at gcc dot gnu.org @ 2023-03-18 17:34 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106576
Paul Thomas <pault at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Resolution|--- |FIXED
Status|NEW |RESOLVED
--- Comment #9 from Paul Thomas <pault at gcc dot gnu.org> ---
Thanks for the report Thomas.
I'll be bugging you in a few weeks to backport to 12-branch.
Tschuess
Paul
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2023-03-18 17:34 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-10 7:45 [Bug fortran/106576] New: Finalization of temporaries from functions not occuring tkoenig at gcc dot gnu.org
2022-08-10 16:50 ` [Bug fortran/106576] " tkoenig at gcc dot gnu.org
2022-08-13 16:09 ` tkoenig at gcc dot gnu.org
2022-11-12 15:55 ` tkoenig at gcc dot gnu.org
2022-11-28 15:11 ` pault at gcc dot gnu.org
2022-11-28 15:12 ` pault at gcc dot gnu.org
2022-12-04 17:27 ` tkoenig at gcc dot gnu.org
2022-12-06 6:12 ` pault at gcc dot gnu.org
2023-03-18 7:56 ` cvs-commit at gcc dot gnu.org
2023-03-18 17:34 ` pault at gcc dot gnu.org
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).