public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug fortran/112459] New: gfortran -w option causes derived-type finalization at creation time
@ 2023-11-09 13:50 bardeau at iram dot fr
2023-11-09 17:46 ` [Bug fortran/112459] " anlauf at gcc dot gnu.org
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: bardeau at iram dot fr @ 2023-11-09 13:50 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112459
Bug ID: 112459
Summary: gfortran -w option causes derived-type finalization at
creation time
Product: gcc
Version: 13.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
Assignee: unassigned at gcc dot gnu.org
Reporter: bardeau at iram dot fr
Target Milestone: ---
Hi everyone,
with gfortran version 13.2.0, the -w compilation switch modifies the code
behavior at execution time. This was not the case with e.g. gfortran 12.1.0.
~> gfortran -v
Using built-in specs.
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=/home/bardeau/Softs/gcc-13.2.0/libexec/gcc/x86_64-pc-linux-gnu/13.2.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../srcdir/configure --with-gmp=/home/bardeau/Softs/gcc-deps
--prefix=/home/bardeau/Softs/gcc-13.2.0 --enable-languages=c,c++,fortran
--disable-multilib
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 13.2.0 (GCC)
Code example:
module mymod
type mysubtype
integer(kind=4), allocatable :: a(:)
end type mysubtype
type :: mytype
integer :: i
type(mysubtype) :: sub
contains
final :: mytype_final
end type mytype
contains
subroutine mysubtype_final(sub)
type(mysubtype), intent(inout) :: sub
print *,'MYSUBTYPE>FINAL'
if (allocated(sub%a)) deallocate(sub%a)
end subroutine mysubtype_final
subroutine mytype_final(typ)
type(mytype), intent(inout) :: typ
print *,"MYTYPE>FINAL"
call mysubtype_final(typ%sub)
end subroutine mytype_final
end module mymod
!
program myprog
use mymod
type(mytype), pointer :: c
print *,"Before allocation"
allocate(c)
print *,"After allocation"
end program myprog
Compilation and execution:
~> gfortran -w test1.f90 -o test1 && ./test1
Before allocation
MYTYPE>FINAL
MYSUBTYPE>FINAL
After allocation
The problem is that the FINAL procedure (mytype_final) is invoked at the time
the c variable is allocated, which is unexpected. Plus, this behavior is
random. If the "sub" component is removed from "mytype", mytype_final is not
invoked anymore. I also have a much more complex example where the program
crashes because the evaluation "allocated(sub%a)" is incorrect and leads to
deallocation of the unallocated "sub%a". All these behaviors are correlated to
the presence of the -w option.
In order to be complete, I must say that the -w option is not described in
https://gcc.gnu.org/onlinedocs/gcc-13.2.0/gfortran/Error-and-Warning-Options.html
but it is suggested in -fallow-argument-mismatch (documented here:
https://gcc.gnu.org/onlinedocs/gcc-13.2.0/gfortran/Fortran-Dialect-Options.html
). In practice it can be used for example with:
subroutine test
call foo()
call foo(1)
end subroutine test
~> gfortran -c -fallow-argument-mismatch -w test2.f90
which shows no warning thanks to -w.
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug fortran/112459] gfortran -w option causes derived-type finalization at creation time
2023-11-09 13:50 [Bug fortran/112459] New: gfortran -w option causes derived-type finalization at creation time bardeau at iram dot fr
@ 2023-11-09 17:46 ` anlauf at gcc dot gnu.org
2023-11-09 18:18 ` pault at gcc dot gnu.org
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: anlauf at gcc dot gnu.org @ 2023-11-09 17:46 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112459
anlauf at gcc dot gnu.org changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |pault at gcc dot gnu.org
--- Comment #1 from anlauf at gcc dot gnu.org ---
When I compile the code with -std=f2008, I get:
pr112459.f90:28:13:
28 | allocate(c)
| 1
Warning: The structure constructor at (1) has been finalized. This feature was
removed by f08/0011. Use -std=f2018 or -std=gnu to eliminate the finalization.
It behaves as you expect if I specify -std=gnu or -std=f2018.
Trying several combinations, it appears the following variants work:
-std=gnu
-std=f2018
-std=f2018 -w
and these "fail":
-w
-std=f2008
-std=f2008 -w
-std=gnu -w
Note that default is -std=gnu .
Now I wonder how -w interferes with -std=gnu ...
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug fortran/112459] gfortran -w option causes derived-type finalization at creation time
2023-11-09 13:50 [Bug fortran/112459] New: gfortran -w option causes derived-type finalization at creation time bardeau at iram dot fr
2023-11-09 17:46 ` [Bug fortran/112459] " anlauf at gcc dot gnu.org
@ 2023-11-09 18:18 ` pault at gcc dot gnu.org
2023-11-11 10:17 ` pault at gcc dot gnu.org
2023-12-16 13:59 ` cvs-commit at gcc dot gnu.org
3 siblings, 0 replies; 5+ messages in thread
From: pault at gcc dot gnu.org @ 2023-11-09 18:18 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112459
Paul Thomas <pault at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Last reconfirmed| |2023-11-09
Status|UNCONFIRMED |NEW
Ever confirmed|0 |1
Blocks| |37336
--- Comment #2 from Paul Thomas <pault at gcc dot gnu.org> ---
It has been on my TODO list to partially revert the finalization of structure
and array constructors so that gfortran behaves like nagfor and only "knows"
about F2018. Finalization of constructors per se was removed in F2018 for very
good reasons!
I am still working on the CLASS variants of PR99065. Perhaps I should put that
on one side and clean up finalization?
@Sebastien - I will have to see what the -w switch does and why it should
affect the code behaviour. I can confirm the behaviour that you describe, as
Harald has already done. The F2003 and F2008 specific parts are blocked by:
if (!gfc_notification_std (GFC_STD_F2018_DEL) && .... Evidently switching off
the warnings with -w causes this to return true!
Cheers
Paul
Referenced Bugs:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=37336
[Bug 37336] [F03] Finish derived-type finalization
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug fortran/112459] gfortran -w option causes derived-type finalization at creation time
2023-11-09 13:50 [Bug fortran/112459] New: gfortran -w option causes derived-type finalization at creation time bardeau at iram dot fr
2023-11-09 17:46 ` [Bug fortran/112459] " anlauf at gcc dot gnu.org
2023-11-09 18:18 ` pault at gcc dot gnu.org
@ 2023-11-11 10:17 ` pault at gcc dot gnu.org
2023-12-16 13:59 ` cvs-commit at gcc dot gnu.org
3 siblings, 0 replies; 5+ messages in thread
From: pault at gcc dot gnu.org @ 2023-11-11 10:17 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112459
--- Comment #3 from Paul Thomas <pault at gcc dot gnu.org> ---
Hi Sebastien,
I have posted the patch to the gfortran list. Hopefully, the bug will be fixed
this weekend.
Thanks for the report.
Paul
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug fortran/112459] gfortran -w option causes derived-type finalization at creation time
2023-11-09 13:50 [Bug fortran/112459] New: gfortran -w option causes derived-type finalization at creation time bardeau at iram dot fr
` (2 preceding siblings ...)
2023-11-11 10:17 ` pault at gcc dot gnu.org
@ 2023-12-16 13:59 ` cvs-commit at gcc dot gnu.org
3 siblings, 0 replies; 5+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2023-12-16 13:59 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112459
--- Comment #4 from GCC 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:9a1105b770df9a9b485705398abbb74b5c487a25
commit r14-6621-g9a1105b770df9a9b485705398abbb74b5c487a25
Author: Paul Thomas <pault@gcc.gnu.org>
Date: Sat Dec 16 13:59:45 2023 +0000
Fortran: Prevent unwanted finalization with -w option [PR112459]
2023-12-16 Paul Thomas <pault@gcc.gnu.org>
gcc/fortran
PR fortran/112459
* trans-array.cc (gfc_trans_array_constructor_value): Replace
gfc_notification_std with explicit logical expression that
selects F2003/2008 and excludes -std=default/gnu.
* trans-expr.cc (gfc_conv_expr): Ditto.
gcc/testsuite/
PR fortran/112459
* gfortran.dg/pr112459.f90: New test.
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2023-12-16 13:59 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-11-09 13:50 [Bug fortran/112459] New: gfortran -w option causes derived-type finalization at creation time bardeau at iram dot fr
2023-11-09 17:46 ` [Bug fortran/112459] " anlauf at gcc dot gnu.org
2023-11-09 18:18 ` pault at gcc dot gnu.org
2023-11-11 10:17 ` pault at gcc dot gnu.org
2023-12-16 13:59 ` cvs-commit 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).