re PR fortran/65024 ([OOP] unlimited polymorphic pointer structure not built when...
authorPaul Thomas <pault@gcc.gnu.org>
Tue, 10 Mar 2015 19:39:05 +0000 (19:39 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Tue, 10 Mar 2015 19:39:05 +0000 (19:39 +0000)
2015-03-10  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/65024
* trans-expr.c (gfc_conv_component_ref): If the component
backend declaration is missing and the derived type symbol is
available in the reference, call gfc_build_derived_type.

2015-03-10  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/65024
* gfortran.dg/unlimited_polymorphic_23.f90: New test

From-SVN: r221334

gcc/fortran/ChangeLog
gcc/fortran/trans-expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/unlimited_polymorphic_23.f90 [new file with mode: 0644]

index ae6865eff416e507744ffb0efbf92db070a596f7..b9f34a33c67a8266f6f13575aa6bb3df34ed57de 100644 (file)
@@ -1,3 +1,10 @@
+2015-03-10  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/65024
+       * trans-expr.c (gfc_conv_component_ref): If the component
+       backend declaration is missing and the derived type symbol is
+       available in the reference, call gfc_build_derived_type.
+
 2015-03-10  Alessandro Fanfarillo  <fanfarillo.gcc@gmail.com>
            Tobias Burnus  <burnus@net-b.de>
 
index db04b30671d96a3420d100110f4c781fa81b6939..353d0120d9de31688e5a37edc4a75099ef3b4466 100644 (file)
@@ -1930,10 +1930,12 @@ gfc_conv_component_ref (gfc_se * se, gfc_ref * ref)
 
   c = ref->u.c.component;
 
-  gcc_assert (c->backend_decl);
+  if (c->backend_decl == NULL_TREE
+      && ref->u.c.sym != NULL)
+    gfc_get_derived_type (ref->u.c.sym);
 
   field = c->backend_decl;
-  gcc_assert (TREE_CODE (field) == FIELD_DECL);
+  gcc_assert (field && TREE_CODE (field) == FIELD_DECL);
   decl = se->expr;
 
   /* Components can correspond to fields of different containing
index e0daa10eb9b9113e4dc1e13c64375f7010467f20..5acef589ff2debd983f988ce4e4328d57887e8d6 100644 (file)
@@ -1,3 +1,8 @@
+2015-03-10  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/65024
+       * gfortran.dg/unlimited_polymorphic_23.f90: New test
+
 2015-03-10  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/65127
diff --git a/gcc/testsuite/gfortran.dg/unlimited_polymorphic_23.f90 b/gcc/testsuite/gfortran.dg/unlimited_polymorphic_23.f90
new file mode 100644 (file)
index 0000000..27eff31
--- /dev/null
@@ -0,0 +1,35 @@
+! {dg-do run }
+!
+! Test the fix for PR65024, in which the structure for the 'info'
+! component of type 'T' was not being converted into TREE_SSA and
+! so caused an ICE in trans-expr.c:gfc_conv_component_ref.
+!
+! Reported by  <matt@gneilson.plus.com>
+!
+MODULE X
+  TYPE T
+    CLASS(*), pointer :: info
+  END TYPE
+END MODULE
+
+PROGRAM P
+  call bug
+CONTAINS
+  SUBROUTINE BUG
+    USE X
+    CLASS(T), pointer :: e
+    integer, target :: i = 42
+    allocate(e)
+    e%info => NULL ()      ! used to ICE
+    if (.not.associated(e%info)) e%info => i      ! used to ICE
+    select type (z => e%info)
+      type is (integer)
+        if (z .ne.i) call abort
+    end select
+  END SUBROUTINE
+
+  SUBROUTINE NEXT
+    USE X
+    CLASS (T), pointer :: e
+  END SUBROUTINE
+END