diff options
author | Harald Anlauf <anlauf@gmx.de> | 2024-03-28 22:34:40 +0100 |
---|---|---|
committer | Harald Anlauf <anlauf@gmx.de> | 2024-03-29 10:31:38 +0100 |
commit | 6fb253a25dff13253d63553f02e0fe72c5e3ab4e (patch) | |
tree | 399619d5ab833997019f4803e439adf774acea0d | |
parent | 3c793f0361bc66d2a6bf0b3e1fb3234fc511e2a6 (diff) | |
download | gcc-6fb253a25dff13253d63553f02e0fe72c5e3ab4e.zip gcc-6fb253a25dff13253d63553f02e0fe72c5e3ab4e.tar.gz gcc-6fb253a25dff13253d63553f02e0fe72c5e3ab4e.tar.bz2 |
Fortran: fix NULL pointer dereference on overlapping initialization [PR50410]
gcc/fortran/ChangeLog:
PR fortran/50410
* trans-expr.cc (gfc_conv_structure): Check for NULL pointer.
gcc/testsuite/ChangeLog:
PR fortran/50410
* gfortran.dg/data_initialized_4.f90: New test.
-rw-r--r-- | gcc/fortran/trans-expr.cc | 2 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/data_initialized_4.f90 | 16 |
2 files changed, 17 insertions, 1 deletions
diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc index 079ac93..d21e395 100644 --- a/gcc/fortran/trans-expr.cc +++ b/gcc/fortran/trans-expr.cc @@ -9650,7 +9650,7 @@ gfc_conv_structure (gfc_se * se, gfc_expr * expr, int init) cm = expr->ts.u.derived->components; for (c = gfc_constructor_first (expr->value.constructor); - c; c = gfc_constructor_next (c), cm = cm->next) + c && cm; c = gfc_constructor_next (c), cm = cm->next) { /* Skip absent members in default initializers and allocatable components. Although the latter have a default initializer diff --git a/gcc/testsuite/gfortran.dg/data_initialized_4.f90 b/gcc/testsuite/gfortran.dg/data_initialized_4.f90 new file mode 100644 index 0000000..156b660 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/data_initialized_4.f90 @@ -0,0 +1,16 @@ +! { dg-do compile } +! { dg-additional-options "-std=legacy" } +! +! PR fortran/50410 +! +! Silently allow overlapping initialization in legacy mode (used to ICE) + +program p + implicit none + type t + integer :: g = 1 + end type t + type(t) :: u = t(2) + data u%g /3/ + print *, u ! this might print "2" +end |