re PR fortran/86888 ([F08] allocatable components of indirectly recursive type)
authorJanus Weil <janus@gcc.gnu.org>
Wed, 22 Aug 2018 17:10:00 +0000 (19:10 +0200)
committerJanus Weil <janus@gcc.gnu.org>
Wed, 22 Aug 2018 17:10:00 +0000 (19:10 +0200)
fix PR 86888

2018-08-22  Janus Weil  <janus@gcc.gnu.org>

PR fortran/86888
* decl.c (gfc_match_data_decl): Allow allocatable components of
indirectly recursive type.
* resolve.c (resolve_component): Remove two errors messages ...
(resolve_fl_derived): ... and replace them by a new one.

2018-08-22  Janus Weil  <janus@gcc.gnu.org>

PR fortran/86888
* gfortran.dg/alloc_comp_basics_6.f90: Update an error message and add
an additional case.
* gfortran.dg/alloc_comp_basics_7.f90: New test case.
* gfortran.dg/class_17.f03: Update error message.
* gfortran.dg/class_55.f90: Ditto.
* gfortran.dg/dtio_11.f90: Update error messages.
* gfortran.dg/implicit_actual.f90: Add an error message.
* gfortran.dg/typebound_proc_12.f90: Update error message.

From-SVN: r263782

gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/fortran/resolve.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/alloc_comp_basics_6.f90
gcc/testsuite/gfortran.dg/alloc_comp_basics_7.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/class_17.f03
gcc/testsuite/gfortran.dg/class_55.f90
gcc/testsuite/gfortran.dg/dtio_11.f90
gcc/testsuite/gfortran.dg/implicit_actual.f90
gcc/testsuite/gfortran.dg/typebound_proc_12.f90

index c91ffc93493ef7f8fcd74224cd9c5a1858134e5d..2cd5dcf3304d4a87cf0585fce8cc79e471d4990f 100644 (file)
@@ -1,3 +1,11 @@
+2018-08-22  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/86888
+       * decl.c (gfc_match_data_decl): Allow allocatable components of
+       indirectly recursive type.
+       * resolve.c (resolve_component): Remove two errors messages ...
+       (resolve_fl_derived): ... and replace them by a new one.
+
 2018-08-21  Janne Blomqvist  <jb@gcc.gnu.org>
 
        * trans-intrinsic.c (gfc_conv_intrinsic_minmax): Use
index 1384bc717d8c753ab25b2515c9cc4d8f5aa3b925..03298833c98d5ad4a74c3ff05616c06c38c255f3 100644 (file)
@@ -5864,8 +5864,7 @@ gfc_match_data_decl (void)
       if (current_attr.pointer && gfc_comp_struct (gfc_current_state ()))
        goto ok;
 
-      if (current_attr.allocatable && gfc_current_state () == COMP_DERIVED
-         && current_ts.u.derived == gfc_current_block ())
+      if (current_attr.allocatable && gfc_current_state () == COMP_DERIVED)
        goto ok;
 
       gfc_find_symbol (current_ts.u.derived->name,
index d65118dfae3cf224ecf5811f844d4004aa7845e0..4ad4dcf780d0084486f7e71d771229f7e5fb7afc 100644 (file)
@@ -14001,28 +14001,6 @@ resolve_component (gfc_component *c, gfc_symbol *sym)
     CLASS_DATA (c)->ts.u.derived
                     = gfc_find_dt_in_generic (CLASS_DATA (c)->ts.u.derived);
 
-  if (!sym->attr.is_class && c->ts.type == BT_DERIVED && !sym->attr.vtype
-      && c->attr.pointer && c->ts.u.derived->components == NULL
-      && !c->ts.u.derived->attr.zero_comp)
-    {
-      gfc_error ("The pointer component %qs of %qs at %L is a type "
-                 "that has not been declared", c->name, sym->name,
-                 &c->loc);
-      return false;
-    }
-
-  if (c->ts.type == BT_CLASS && c->attr.class_ok
-      && CLASS_DATA (c)->attr.class_pointer
-      && CLASS_DATA (c)->ts.u.derived->components == NULL
-      && !CLASS_DATA (c)->ts.u.derived->attr.zero_comp
-      && !UNLIMITED_POLY (c))
-    {
-      gfc_error ("The pointer component %qs of %qs at %L is a type "
-                 "that has not been declared", c->name, sym->name,
-                 &c->loc);
-      return false;
-    }
-
   /* If an allocatable component derived type is of the same type as
      the enclosing derived type, we need a vtable generating so that
      the __deallocate procedure is created.  */
@@ -14258,6 +14236,13 @@ resolve_fl_derived (gfc_symbol *sym)
                          &sym->declared_at))
     return false;
 
+  if (sym->components == NULL && !sym->attr.zero_comp)
+    {
+      gfc_error ("Derived type %qs at %L has not been declared",
+                 sym->name, &sym->declared_at);
+      return false;
+    }
+
   /* Resolve the finalizer procedures.  */
   if (!gfc_resolve_finalizers (sym, NULL))
     return false;
index 42f10aef56285a8fa7518c28096ad4a42be603a2..59a9038dd043eacf43228115abbbd0bf1a8d3e76 100644 (file)
@@ -1,3 +1,15 @@
+2018-08-22  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/86888
+       * gfortran.dg/alloc_comp_basics_6.f90: Update an error message and add
+       an additional case.
+       * gfortran.dg/alloc_comp_basics_7.f90: New test case.
+       * gfortran.dg/class_17.f03: Update error message.
+       * gfortran.dg/class_55.f90: Ditto.
+       * gfortran.dg/dtio_11.f90: Update error messages.
+       * gfortran.dg/implicit_actual.f90: Add an error message.
+       * gfortran.dg/typebound_proc_12.f90: Update error message.
+
 2018-08-22  Martin Sebor  <msebor@redhat.com>
 
        PR middle-end/87052
index 3ed221db24f0965ef0a780669ed1aa965055205e..4eb0e49a7e52eaa11d38cf525e500c54d2582e2d 100644 (file)
@@ -5,7 +5,8 @@
 ! Contributed by Joost VandeVondele <Joost.VandeVondele@mat.ethz.ch>
 
   type sysmtx_t
-     type(ext_complex_t), allocatable :: S(:)  ! { dg-error "has not been previously defined" }
+     type(ext_complex_t), allocatable :: S(:)  ! { dg-error "has not been declared" }
+     class(some_type), allocatable :: X        ! { dg-error "has not been declared" }
   end type
 
 end
diff --git a/gcc/testsuite/gfortran.dg/alloc_comp_basics_7.f90 b/gcc/testsuite/gfortran.dg/alloc_comp_basics_7.f90
new file mode 100644 (file)
index 0000000..7229630
--- /dev/null
@@ -0,0 +1,15 @@
+! { dg-do compile }
+!
+! PR 86888: [F08] allocatable components of indirectly recursive type
+!
+! Contributed by Janus Weil <janus@gcc.gnu.org>
+
+type :: s
+   type(t), allocatable :: x
+end type
+
+type :: t
+   type(s), allocatable :: y
+end type
+
+end
index 0c5c23884d97f6608bb08dfc21182dd40f1079d9..24b0e7b61f3f6c808595fbb47a7cea888bf02b6c 100644 (file)
@@ -56,7 +56,7 @@ end MODULE error_stack_module
 module b_module
   implicit none
   type::b_type
-     class(not_yet_defined_type_type),pointer::b_component  ! { dg-error "is a type that has not been declared" }
+     class(not_yet_defined_type_type),pointer::b_component  ! { dg-error "has not been declared" }
   end type b_type
 end module b_module
  
index b47989f416c534bc196e0955ec657a2a5b1b77e8..e629698253617b3d1bf05d5ab13fade228da42de 100644 (file)
@@ -5,7 +5,7 @@
 ! Contributed by Sylwester Arabas <slayoo@staszic.waw.pl>
 
   type :: mpdata_t
-    class(bcd_t), pointer :: bcx, bcy   ! { dg-error "is a type that has not been declared" }
+    class(bcd_t), pointer :: bcx, bcy   ! { dg-error "has not been declared" }
   end type
   type(mpdata_t) :: this
   call this%bcx%fill_halos()            ! { dg-error "is being used before it is defined" }
index 1f148c3b8960116e7dec42cde6aca39f22344d58..cf939328139c030299ce85bf92abd648713de83c 100644 (file)
@@ -15,13 +15,13 @@ end
 ! PR77533 - used to ICE after error
 module m2
    type t
-      type(unknown), pointer :: next ! { dg-error "is a type that has not been declared" }
+      type(unknown), pointer :: next ! { dg-error "has not been declared" }
    contains
-      procedure :: s
+      procedure :: s  ! { dg-error "Non-polymorphic passed-object" }
       generic :: write(formatted) => s
    end type
 contains
-   subroutine s(x)
+   subroutine s(x)  ! { dg-error "Too few dummy arguments" }
    end
 end
 
index 108c04079676a0e28499dfc4b7c2b36dd6e31633..79258c88b8799f445820db3e56ede66be640d6ba 100644 (file)
@@ -14,7 +14,7 @@ end module global
 
 program snafu
 !  use global
-  implicit type (t3) (z)
+  implicit type (t3) (z)  ! { dg-error "has not been declared" }
 
   call foo (zin) ! { dg-error "defined|Type mismatch" }
 
index 4612d4982f3bd49fcb8007b1edb59e7b3310fb2d..ea43dab8767d9397eb82961112592647ef550537 100644 (file)
@@ -5,7 +5,7 @@
 ! Contributed by Joost VandeVondele <jv244@cam.ac.uk>
 !
   TYPE a
-    TYPE(b), DIMENSION(:), POINTER :: c  ! { dg-error "type that has not been declared" }
+    TYPE(b), DIMENSION(:), POINTER :: c  ! { dg-error "has not been declared" }
   END TYPE
   TYPE(a), POINTER :: d
   CALL X(d%c%e)         ! { dg-error "before it is defined" }