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.
This commit is contained in:
parent
1e6c0e69af
commit
c049f638da
2 changed files with 45 additions and 2 deletions
|
@ -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;
|
||||
|
|
43
gcc/testsuite/gfortran.dg/dec_union_12.f90
Executable file
43
gcc/testsuite/gfortran.dg/dec_union_12.f90
Executable file
|
@ -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
|
Loading…
Add table
Reference in a new issue