aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2015-03-10 19:39:05 +0000
committerPaul Thomas <pault@gcc.gnu.org>2015-03-10 19:39:05 +0000
commit48188959fd8a9bb1d7da833466f314210693bc11 (patch)
tree0221006f58a79ee652d8b698c5ec3d634a53c2a3 /gcc
parent704c79040af06477eaa18ee560270f22214a359a (diff)
downloadgcc-48188959fd8a9bb1d7da833466f314210693bc11.zip
gcc-48188959fd8a9bb1d7da833466f314210693bc11.tar.gz
gcc-48188959fd8a9bb1d7da833466f314210693bc11.tar.bz2
re PR fortran/65024 ([OOP] unlimited polymorphic pointer structure not built when it should be)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/trans-expr.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/unlimited_polymorphic_23.f9035
4 files changed, 51 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index ae6865e..b9f34a3 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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>
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index db04b30..353d012 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e0daa10..5acef58 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..27eff31
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/unlimited_polymorphic_23.f90
@@ -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