Hi All, Another one bites the dust! The patch is commented such that it is self-explanatory.
Regtests on FC33/x86_64 - OK for master? Paul Fortran: Correct missing structure constructor comps. [PR97612]. 2020-12-27 Paul Thomas <pa...@gcc.gnu.org> gcc/fortran PR fortran/97612 * primary.c (build_actual_constructor): Missing allocatable components are set unallocated using EXPR_NULL. Then missing components are tested for a default initializer. gcc/testsuite/ PR fortran/97612 * gfortran.dg/structure_constructor_17.f90: New test.
diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c index a58a25924da..93d74737284 100644 --- a/gcc/fortran/primary.c +++ b/gcc/fortran/primary.c @@ -3003,26 +3003,36 @@ build_actual_constructor (gfc_structure_ctor_component **comp_head, continue; } - /* If it was not found, try the default initializer if there's any; + /* If it was not found, apply NULL expression to set the component as + unallocated. Then try the default initializer if there's any; otherwise, it's an error unless this is a deferred parameter. */ if (!comp_iter) { - if (comp->initializer) - { - if (!gfc_notify_std (GFC_STD_F2003, "Structure constructor " - "with missing optional arguments at %C")) - return false; - value = gfc_copy_expr (comp->initializer); - } - else if (comp->attr.allocatable - || (comp->ts.type == BT_CLASS - && CLASS_DATA (comp)->attr.allocatable)) + /* F2018 7.5.10: If an allocatable component has no corresponding + component-data-source, then that component has an allocation + status of unallocated.... */ + if (comp->attr.allocatable + || (comp->ts.type == BT_CLASS + && CLASS_DATA (comp)->attr.allocatable)) { if (!gfc_notify_std (GFC_STD_F2008, "No initializer for " "allocatable component %qs given in the " "structure constructor at %C", comp->name)) return false; + value = gfc_get_null_expr (&gfc_current_locus); + } + /* ....(Preceeding sentence) If a component with default + initialization has no corresponding component-data-source, then + the default initialization is applied to that component. */ + else if (comp->initializer) + { + if (!gfc_notify_std (GFC_STD_F2003, "Structure constructor " + "with missing optional arguments at %C")) + return false; + value = gfc_copy_expr (comp->initializer); } + /* Do not trap components such as the string length for deferred + length character components. */ else if (!comp->attr.artificial) { gfc_error ("No initializer for component %qs given in the"
structure_constructor_17.f90
Description: Binary data