public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r10-10111] Fortran: Correct missing structure constructor comps. [PR97612].
@ 2021-09-10 20:49 Harald Anlauf
0 siblings, 0 replies; only message in thread
From: Harald Anlauf @ 2021-09-10 20:49 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:80b1492b2de153f4850a32cafcd8f4d37c2c84fc
commit r10-10111-g80b1492b2de153f4850a32cafcd8f4d37c2c84fc
Author: Paul Thomas <pault@gcc.gnu.org>
Date: Tue Dec 29 17:44:48 2020 +0000
Fortran: Correct missing structure constructor comps. [PR97612].
2020-12-29 Paul Thomas <pault@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.
(cherry picked from commit eeb145317b42d5203056851435457d9189a7303d)
Diff:
---
gcc/fortran/primary.c | 32 ++++++++++++++--------
.../gfortran.dg/structure_constructor_17.f90 | 21 ++++++++++++++
2 files changed, 42 insertions(+), 11 deletions(-)
diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c
index 8edc83a42c3..b03961a9981 100644
--- a/gcc/fortran/primary.c
+++ b/gcc/fortran/primary.c
@@ -3062,26 +3062,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"
diff --git a/gcc/testsuite/gfortran.dg/structure_constructor_17.f90 b/gcc/testsuite/gfortran.dg/structure_constructor_17.f90
new file mode 100644
index 00000000000..8b8230c6f7e
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/structure_constructor_17.f90
@@ -0,0 +1,21 @@
+! { dg-do compile }
+!
+! Test the fix for PR97612.
+!
+! Contributed by Martin Stein <mscfd@gmx.net>
+!
+program constructor_allocatable
+ implicit none
+
+ type :: s
+ integer, dimension(:), allocatable :: u
+ end type s
+
+ type :: t
+ type(s), dimension(:), allocatable :: x
+ end type t
+
+ type(t) :: a = t()
+ if (allocated (a%x)) stop 1
+
+end program constructor_allocatable
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2021-09-10 20:49 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-10 20:49 [gcc r10-10111] Fortran: Correct missing structure constructor comps. [PR97612] Harald Anlauf
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).