]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/65024 ([OOP] unlimited polymorphic pointer structure not built when...
authorPaul Thomas <pault@gcc.gnu.org>
Sun, 15 Mar 2015 09:13:03 +0000 (09:13 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Sun, 15 Mar 2015 09:13:03 +0000 (09:13 +0000)
2015-03-15  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-15  Paul Thomas  <pault@gcc.gnu.org>

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

From-SVN: r221440

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 9f8c177339f707b6eba08a6b308d58d798f8cc39..0a4a9f940342bbf10155d7f561eb33371b353a55 100644 (file)
@@ -1,3 +1,11 @@
+2015-03-15  Paul Thomas  <pault@gcc.gnu.org>
+
+       Backport from mainline
+       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-12  Mikael Morin  <mikael@gcc.gnu.org>
 
        PR fortran/60898
index 850ed834a58b030c78f5a733a3f3a4a47a2b9d65..472059b0b6f96796f4df8c9b3386cca0a06ea32b 100644 (file)
@@ -1553,10 +1553,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 6e720d820f41cb191c7ff07e501f4f346a72f6bf..73c6b9e6a0726a822f65257157f20aa989065867 100644 (file)
@@ -1,3 +1,9 @@
+2015-03-15  Paul Thomas  <pault@gcc.gnu.org>
+
+       Backport from mainline
+       PR fortran/65024
+       * gfortran.dg/unlimited_polymorphic_23.f90: New test
+
 2015-03-12  Mikael Morin  <mikael@gcc.gnu.org>
 
        PR fortran/60898
        Backported from mainline
        2013-09-17  Cong Hou  <congh@google.com>
 
-       * gcc.dg/vect/vect-reduc-dot-s16c.c: Add a test case with dot product 
+       * gcc.dg/vect/vect-reduc-dot-s16c.c: Add a test case with dot product
        on two arrays with short and int types. This should not be recognized
        as a dot product pattern.
 
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