public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
From: Fritz Reese <foreese@gcc.gnu.org>
To: gcc-cvs@gcc.gnu.org
Subject: [gcc r12-8215] fortran: Fix conv of UNION constructors [PR105310]
Date: Thu, 21 Apr 2022 14:14:59 +0000 (GMT)	[thread overview]
Message-ID: <20220421141459.0449C3857C6F@sourceware.org> (raw)

https://gcc.gnu.org/g:c049f638da4f7b32b11e4d895184e0960bae5291

commit r12-8215-gc049f638da4f7b32b11e4d895184e0960bae5291
Author: Fritz Reese <foreese@gcc.gnu.org>
Date:   Tue Apr 19 16:45:46 2022 -0400

    fortran: Fix conv of UNION constructors [PR105310]
    
    This fixes an ICE when a UNION is the (1+8*2^n)-th field in a DEC
    STRUCTURE when compiled with -finit-derived -finit-local-zero.
    The problem was CONSTRUCTOR_APPEND_ELT from within gfc_conv_union_initializer
    modified the vector pointer, but the pointer was passed by-value,
    so the old pointer from the caller (gfc_conv_structure) pointed to freed
    memory.
    
            PR fortran/105310
    
    gcc/fortran/ChangeLog:
    
            * trans-expr.cc (gfc_conv_union_initializer): Pass vec* by reference.
    
    gcc/testsuite/ChangeLog:
    
            * gfortran.dg/dec_union_12.f90: New test.

Diff:
---
 gcc/fortran/trans-expr.cc                  |  4 +--
 gcc/testsuite/gfortran.dg/dec_union_12.f90 | 43 ++++++++++++++++++++++++++++++
 2 files changed, 45 insertions(+), 2 deletions(-)

diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index 06713f24f95..ab710efc451 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -9194,8 +9194,8 @@ gfc_trans_structure_assign (tree dest, gfc_expr * expr, bool init, bool coarray)
   return gfc_finish_block (&block);
 }
 
-void
-gfc_conv_union_initializer (vec<constructor_elt, va_gc> *v,
+static void
+gfc_conv_union_initializer (vec<constructor_elt, va_gc> *&v,
                             gfc_component *un, gfc_expr *init)
 {
   gfc_constructor *ctor;
diff --git a/gcc/testsuite/gfortran.dg/dec_union_12.f90 b/gcc/testsuite/gfortran.dg/dec_union_12.f90
new file mode 100755
index 00000000000..26671230b05
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/dec_union_12.f90
@@ -0,0 +1,43 @@
+! { dg-do compile }
+! { dg-options "-std=legacy -ffree-form -finit-local-zero -finit-derived -fdec-structure" }
+!
+! PR fortran/105310
+!
+! Test that gfc_conv_union_initializer does not cause an ICE when called
+! to build the constructor for a field which triggers a vector resize.
+!
+
+program dec_union_12
+  implicit none
+STRUCTURE /foo8u/
+  ! 8 fields
+  INTEGER(4) :: a,b,c,d,e,f,g,h
+  UNION
+  MAP
+  ENDMAP
+  ENDUNION
+ENDSTRUCTURE
+STRUCTURE /foo16u/
+  ! 16 fields
+  INTEGER(4) :: a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p
+  UNION
+  MAP
+  ENDMAP
+  ENDUNION
+ENDSTRUCTURE
+STRUCTURE /foo32u/
+  ! 32 fields
+  INTEGER(4) :: a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p
+  INTEGER(4) :: aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am,an,ao,ap
+  UNION
+  MAP
+  ENDMAP
+  ENDUNION
+ENDSTRUCTURE
+  record /foo8u/ bar8u
+  record /foo16u/ bar16u
+  record /foo32u/ bar32u
+  bar8u.a = 1
+  bar16u.a = 1
+  bar32u.a = 1
+end


                 reply	other threads:[~2022-04-21 14:14 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220421141459.0449C3857C6F@sourceware.org \
    --to=foreese@gcc.gnu.org \
    --cc=gcc-cvs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).