aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHarald Anlauf <anlauf@gmx.de>2024-03-28 22:34:40 +0100
committerHarald Anlauf <anlauf@gmx.de>2024-03-29 10:31:38 +0100
commit6fb253a25dff13253d63553f02e0fe72c5e3ab4e (patch)
tree399619d5ab833997019f4803e439adf774acea0d
parent3c793f0361bc66d2a6bf0b3e1fb3234fc511e2a6 (diff)
downloadgcc-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.cc2
-rw-r--r--gcc/testsuite/gfortran.dg/data_initialized_4.f9016
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