aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorFritz Reese <foreese@gcc.gnu.org>2022-04-19 16:45:46 -0400
committerFritz Reese <foreese@gcc.gnu.org>2022-04-21 10:13:59 -0400
commitc049f638da4f7b32b11e4d895184e0960bae5291 (patch)
tree0378cadec8364709478b2a23de14677615c96b5c /gcc
parent1e6c0e69af8da436e1d1d2d23d8c38410d78ecf2 (diff)
downloadgcc-c049f638da4f7b32b11e4d895184e0960bae5291.zip
gcc-c049f638da4f7b32b11e4d895184e0960bae5291.tar.gz
gcc-c049f638da4f7b32b11e4d895184e0960bae5291.tar.bz2
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/trans-expr.cc4
-rwxr-xr-xgcc/testsuite/gfortran.dg/dec_union_12.f9043
2 files changed, 45 insertions, 2 deletions
diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index 06713f2..ab710ef 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 0000000..2667123
--- /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