https://gcc.gnu.org/g:4d75e994d6817b84c3236e4e56622fe3bea4af04
commit r17-5068-g4d75e994d6817b84c3236e4e56622fe3bea4af04 Author: Jerry DeLisle <[email protected]> Date: Thu Jun 11 18:17:46 2026 -0700 fortran: [PR125762] Fix segfault for DATA pointer init to an array element Resolve the value expressions of a DATA statement in resolve_data. Assisted-by: Claude Opus 5.5 PR fortran/125762 gcc/fortran/ChangeLog: * resolve.cc (resolve_data): Call gfc_resolve_expr on each value expression. gcc/testsuite/ChangeLog: * gfortran.dg/data_pointer_4.f90: New test. Diff: --- gcc/fortran/resolve.cc | 5 +++++ gcc/testsuite/gfortran.dg/data_pointer_4.f90 | 25 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc index 67eaea64c9bc..29247f4ec2dc 100644 --- a/gcc/fortran/resolve.cc +++ b/gcc/fortran/resolve.cc @@ -20025,10 +20025,15 @@ resolve_data_variables (gfc_data_variable *d) static void resolve_data (gfc_data *d) { + gfc_data_value *v; if (!resolve_data_variables (d->var)) return; + for (v = d->value; v; v = v->next) + if (v->expr && !gfc_resolve_expr (v->expr)) + return; + values.vnode = d->value; if (d->value == NULL) mpz_set_ui (values.left, 0); diff --git a/gcc/testsuite/gfortran.dg/data_pointer_4.f90 b/gcc/testsuite/gfortran.dg/data_pointer_4.f90 new file mode 100644 index 000000000000..6f6d947da152 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/data_pointer_4.f90 @@ -0,0 +1,25 @@ +! { dg-do run } +! +! PR 125762 +! +! A DATA statement initializing a pointer to an array element (or array-element +! substring) target segfaulted in gfc_conv_scalarized_array_ref: the element +! reference reached gfc_conv_array_ref with an unresolved type (AR_UNKNOWN) and +! no scalarizer, so the scalarized path was wrongly taken. + +program p + integer, target :: t(10) = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + integer, pointer :: p1, p2 + + character(5), target :: s(2) = ["abcde", "fghij"] + character(2), pointer :: cp + + data p1 /t(3)/ + data p2 /t(7)/ + data cp /s(2)(2:3)/ + + if (p1 /= 3) stop 1 + if (.not. associated (p1, t(3))) stop 2 + if (p2 /= 7) stop 3 + if (cp /= "gh") stop 4 +end program p
