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: linkBe 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).