aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2023-12-16 13:59:45 +0000
committerPaul Thomas <pault@gcc.gnu.org>2023-12-16 13:59:45 +0000
commit9a1105b770df9a9b485705398abbb74b5c487a25 (patch)
tree55ed3a2d4d56144567889d67a148e5c8f6af5bfd
parent5ae6f524f5d4ee2ab79ba797fa4901daf90afb25 (diff)
downloadgcc-9a1105b770df9a9b485705398abbb74b5c487a25.zip
gcc-9a1105b770df9a9b485705398abbb74b5c487a25.tar.gz
gcc-9a1105b770df9a9b485705398abbb74b5c487a25.tar.bz2
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.
-rw-r--r--gcc/fortran/trans-array.cc4
-rw-r--r--gcc/fortran/trans-expr.cc4
-rw-r--r--gcc/testsuite/gfortran.dg/pr112459.f9037
3 files changed, 43 insertions, 2 deletions
diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index 2930406..633f2af 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -2326,7 +2326,9 @@ gfc_trans_array_constructor_value (stmtblock_t * pblock,
Corrigenda 1 TO 4 for fortran 2008 (f08/0011).
Transmit finalization of this constructor through 'finalblock'. */
- if (!gfc_notification_std (GFC_STD_F2018_DEL) && finalblock != NULL
+ if ((gfc_option.allow_std & (GFC_STD_F2008 | GFC_STD_F2003))
+ && !(gfc_option.allow_std & GFC_STD_GNU)
+ && finalblock != NULL
&& gfc_may_be_finalized (ts)
&& ctr > 0 && desc != NULL_TREE
&& GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (desc)))
diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index b2463a2..f4185db 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -9763,7 +9763,9 @@ gfc_conv_expr (gfc_se * se, gfc_expr * expr)
executable construct containing the reference. This, in fact,
was later deleted by the Combined Techical Corrigenda 1 TO 4 for
fortran 2008 (f08/0011). */
- if (!gfc_notification_std (GFC_STD_F2018_DEL) && expr->must_finalize
+ if ((gfc_option.allow_std & (GFC_STD_F2008 | GFC_STD_F2003))
+ && !(gfc_option.allow_std & GFC_STD_GNU)
+ && expr->must_finalize
&& gfc_may_be_finalized (expr->ts))
{
gfc_warning (0, "The structure constructor at %C has been"
diff --git a/gcc/testsuite/gfortran.dg/pr112459.f90 b/gcc/testsuite/gfortran.dg/pr112459.f90
new file mode 100644
index 0000000..7db243c
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr112459.f90
@@ -0,0 +1,37 @@
+! { dg-do compile }
+! { dg-options "-w -fdump-tree-original" }
+!
+! Contributed by Sebastian Bardeau <bardeau@iram.fr>
+!
+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
+! Final subroutines were called with std=gnu and -w = > 14 "_final"s.
+! { dg-final { scan-tree-dump-times "_final" 12 "original" } }