re PR fortran/60357 ([F08] structure constructor with unspecified values for allocata...
authorJanus Weil <janus@gcc.gnu.org>
Mon, 29 Dec 2014 10:45:21 +0000 (11:45 +0100)
committerJanus Weil <janus@gcc.gnu.org>
Mon, 29 Dec 2014 10:45:21 +0000 (11:45 +0100)
2014-12-29  Janus Weil  <janus@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-29  Janus Weil  <janus@gcc.gnu.org>

PR fortran/60357
* gfortran.dg/alloc_comp_constructor_7.f90: New.

From-SVN: r219098

gcc/fortran/ChangeLog
gcc/fortran/array.c
gcc/fortran/expr.c
gcc/fortran/primary.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/alloc_comp_constructor_7.f90 [new file with mode: 0644]

index d7a76a3c9f9128fc5c5249299f1d3046fa28141e..3329c42347d1edf7b374a5939f1d394fc65b611d 100644 (file)
@@ -1,3 +1,12 @@
+2014-12-29  Janus Weil  <janus@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-28  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR fortran/56867
index e60b938a1742a56d4d9ae3984398d52fe4c0e249..67bd42b511f50cfb887514940c76df1d55b1dd2c 100644 (file)
@@ -1309,6 +1309,9 @@ check_constructor (gfc_constructor_base ctor, bool (*check_function) (gfc_expr *
     {
       e = c->expr;
 
+      if (!e)
+       continue;
+
       if (e->expr_type != EXPR_ARRAY)
        {
          if (!(*check_function)(e))
index a887d4c56610ccb1576cd03f9f73be330298e6b3..51f527dad122267606f2634d1fa3618a7651b598 100644 (file)
@@ -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 77522e54bf040caaafc8a39fa749b40712a29a8f..78c24d48015847d989ca381444cd80d8dd5cfbdb 100644 (file)
@@ -2367,6 +2367,13 @@ build_actual_constructor (gfc_structure_ctor_component **comp_head,
                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"
index 1c5ea71d3429af159502646a13de7bbf6081045b..5706f62f922d33fec53d66275c533259d600e95a 100644 (file)
@@ -1,3 +1,8 @@
+2014-12-29  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/60357
+       * gfortran.dg/alloc_comp_constructor_7.f90: New.
+
 2014-12-29  Hans-Peter Nilsson  <hp@axis.com>
 
        * gcc.dg/lto/pr59626_0.c (ASMNAME, ASMNAME2, STRING): Define.
diff --git a/gcc/testsuite/gfortran.dg/alloc_comp_constructor_7.f90 b/gcc/testsuite/gfortran.dg/alloc_comp_constructor_7.f90
new file mode 100644 (file)
index 0000000..45d8272
--- /dev/null
@@ -0,0 +1,18 @@
+! { dg-do run }
+!
+! PR 60357: [F08] structure constructor with unspecified values for allocatable components
+!
+! Contributed by Antony Lewis <antony@cosmologist.info>
+
+Type A
+  integer :: X = 1
+  integer, allocatable :: y
+  integer, allocatable :: z(:)
+end type
+
+Type(A) :: Me = A(X=1)
+
+if (allocated(Me%y)) call abort
+if (allocated(Me%z)) call abort
+
+end