Le 08/10/2026 à 14:32, Paul Richard Thomas a écrit :
bug4-dealloc-scope-exit.f90 fails in runtime with:

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

Backtrace for this error:
#0  0x7f2b83809803 in ???
#1  0x7f2b838083b5 in ???
#2  0x7f2b834dcfaf in ???
#3  0x40066f in n1
at /home/pault/prs/pdt_conformance/reducers/bug4-dealloc-scope-exit.f90:14
#4  0x4006c9 in main
at /home/pault/prs/pdt_conformance/reducers/bug4-dealloc-scope-exit.f90:14
Segmentation fault         (core dumped) ./a.out

The patch is straightforward enough as not to need explanation.

Passes regtesting on FC44/x86_64. OK for mainline.

Cheers

Paul

bug4.patch

From b308d107d4ac32e348e2d728764e3910af9c3a92 Mon Sep 17 00:00:00 2001
From: Paul Thomas <[email protected]>
Date: Thu, 8 Oct 2026 09:58:52 +0100
Subject: [PATCH] Fortran: [meta-bug] [PDT] Parameterized derived type errors
 [PR82173]

2026-10-06  Paul Thomas  <[email protected]>

gcc/fortran
        PR fortran/82173
        * trans-decl.cc (gfc_trans_deferred_vars): Small formatting
        adjustment followed by a guarding of the pdt component dealloc
        for allocatable variables.

gcc/testsuite/
        PR fortran/82173
        * gfortran.dg/pdt_bug4.f90: New test.
---
 gcc/fortran/trans-decl.cc              | 16 ++++++++++++++++
 gcc/testsuite/gfortran.dg/pdt_bug4.f90 | 14 ++++++++++++++
 2 files changed, 30 insertions(+)
 create mode 100644 gcc/testsuite/gfortran.dg/pdt_bug4.f90

diff --git a/gcc/fortran/trans-decl.cc b/gcc/fortran/trans-decl.cc
index a614e71eced..0229cc7ab82 100644
--- a/gcc/fortran/trans-decl.cc
+++ b/gcc/fortran/trans-decl.cc
@@ -5179,6 +5179,22 @@ gfc_trans_deferred_vars (gfc_symbol * proc_sym, 
gfc_wrapped_block * block)
              else
                tmp = NULL_TREE;
+ if (sym->attr.allocatable && !sym->attr.result
+                 && !GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (sym->backend_decl)))
+               {
+                 /* Only deallocate the PDT comonents if the variable has not
+                    been deallocated.  Arrays are guarded elsewhere.  */
+                 tree null_cond, zero;
+                 null_cond = sym->backend_decl;
+                 zero = build_int_cst (TREE_TYPE (null_cond), 0);
+                 null_cond = fold_build2_loc (input_location, NE_EXPR,
+                                              logical_type_node,
+                                              null_cond, zero);
+                 tmp = build3_loc (input_location, COND_EXPR, void_type_node,
+                                   null_cond, tmp,
+                                   build_empty_stmt (input_location));
+               }
+
From the context, it seems that `tmp' can be NULL_TREE. So please add a check excluding that case (unless there is something that already provides that guarantee).
OK with that change.

              gfc_add_init_cleanup (block, gfc_finish_block (&tmpblock), tmp);
            }
          else if (sym->attr.dummy)

Reply via email to