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).