Hi all,

here is a small patch for an F08 extension: Allocatable components
don't have to be specified in structure constructors any more.

Regtested on x86_64-unknown-linux-gnu. Ok for trunk?

Cheers,
Janus



2014-12-27  Janus Weil  <ja...@gcc.gnu.org>

    PR fortran/60357
    * array.c (check_constructor): Ignore empty expressions.
    * expr.c (check_alloc_comp_init): Check if constructor expression
    exists.
    * primary.c (build_actual_constructor): Warn for absent alloc-comp
    initializers in pre-2008 standards.

2014-12-27  Janus Weil  <ja...@gcc.gnu.org>

    PR fortran/60357
    * gfortran.dg/alloc_comp_constructor_7.f90: New.
Index: gcc/fortran/array.c
===================================================================
--- gcc/fortran/array.c (Revision 219082)
+++ gcc/fortran/array.c (Arbeitskopie)
@@ -1309,6 +1309,9 @@ check_constructor (gfc_constructor_base ctor, bool
     {
       e = c->expr;
 
+      if (!e)
+       continue;
+
       if (e->expr_type != EXPR_ARRAY)
        {
          if (!(*check_function)(e))
Index: gcc/fortran/expr.c
===================================================================
--- gcc/fortran/expr.c  (Revision 219082)
+++ gcc/fortran/expr.c  (Arbeitskopie)
@@ -2201,7 +2201,7 @@ check_alloc_comp_init (gfc_expr *e)
        ctor = gfc_constructor_first (e->value.constructor);
        comp; comp = comp->next, ctor = gfc_constructor_next (ctor))
     {
-      if (comp->attr.allocatable
+      if (comp->attr.allocatable && ctor->expr
           && ctor->expr->expr_type != EXPR_NULL)
         {
          gfc_error ("Invalid initialization expression for ALLOCATABLE "
Index: gcc/fortran/primary.c
===================================================================
--- gcc/fortran/primary.c       (Revision 219082)
+++ gcc/fortran/primary.c       (Arbeitskopie)
@@ -2367,6 +2367,13 @@ build_actual_constructor (gfc_structure_ctor_compo
                return false;
              value = gfc_copy_expr (comp->initializer);
            }
+         else if (comp->attr.allocatable)
+           {
+             if (!gfc_notify_std (GFC_STD_F2008, "No initializer for "
+                 "allocatable component '%s' given in the structure "
+                 "constructor at %C", comp->name))
+               return false;
+           }
          else if (!comp->attr.deferred_parameter)
            {
              gfc_error ("No initializer for component %qs given in the"
! { dg-do compile }
!
! PR 60357: [F08] structure constructor with unspecified values for allocatable components
!
! Contributed by Antony Lewis <ant...@cosmologist.info>

Type A
  integer :: X = 1
  integer, allocatable :: y
end type A

Type(A) :: Me = A(X=1)

end

Reply via email to