aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJanus Weil <janus@gcc.gnu.org>2015-01-02 17:31:52 +0100
committerJanus Weil <janus@gcc.gnu.org>2015-01-02 17:31:52 +0100
commit74a1c62fca5ca93ae932ac76ca442660d9c78c3a (patch)
tree1a3c295bbabbdb58c8d6b49ea5948478a94694b0
parent09ed8520b912f4455741528556e62cd3cfa8a53d (diff)
downloadgcc-74a1c62fca5ca93ae932ac76ca442660d9c78c3a.zip
gcc-74a1c62fca5ca93ae932ac76ca442660d9c78c3a.tar.gz
gcc-74a1c62fca5ca93ae932ac76ca442660d9c78c3a.tar.bz2
re PR fortran/57562 ([OOP] ICE due to extended derived type with PARAMETER attribute)
2015-01-02 Janus Weil <janus@gcc.gnu.org> PR fortran/57562 * expr.c (find_component_ref): Deal with extended types. 2015-01-02 Janus Weil <janus@gcc.gnu.org> PR fortran/57562 * gfortran.dg/extends_16.f90: New. From-SVN: r219144
-rw-r--r--gcc/fortran/ChangeLog5
-rw-r--r--gcc/fortran/expr.c19
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gfortran.dg/extends_16.f9025
4 files changed, 51 insertions, 5 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index ea72687..9c88eb8 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,8 @@
+2015-01-02 Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/57562
+ * expr.c (find_component_ref): Deal with extended types.
+
2015-01-02 Tobias Burnus <burnus@net-b.de>
* trans-decl.c (gfc_build_qualified_array): Fix coarray tokens
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c
index 51f527d..2d85092 100644
--- a/gcc/fortran/expr.c
+++ b/gcc/fortran/expr.c
@@ -1270,12 +1270,23 @@ depart:
static gfc_constructor *
find_component_ref (gfc_constructor_base base, gfc_ref *ref)
{
- gfc_component *comp;
- gfc_component *pick;
+ gfc_component *pick = ref->u.c.component;
gfc_constructor *c = gfc_constructor_first (base);
- comp = ref->u.c.sym->components;
- pick = ref->u.c.component;
+ gfc_symbol *dt = ref->u.c.sym;
+ int ext = dt->attr.extension;
+
+ /* For extended types, check if the desired component is in one of the
+ * parent types. */
+ while (ext > 0 && gfc_find_component (dt->components->ts.u.derived,
+ pick->name, true, true))
+ {
+ dt = dt->components->ts.u.derived;
+ c = gfc_constructor_first (c->expr->value.constructor);
+ ext--;
+ }
+
+ gfc_component *comp = dt->components;
while (comp != pick)
{
comp = comp->next;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 095b09d..5fc092e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-01-02 Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/57562
+ * gfortran.dg/extends_16.f90: New.
+
2015-01-02 Tobias Burnus <burnus@net-b.de>
* gfortran.dg/coarray/caf.exp (dg-compile-aux-modules): Add.
@@ -12,7 +17,7 @@
2015-01-02 Janus Weil <janus@gcc.gnu.org>
PR fortran/60507
- * gfortran.dg/dummy_procedure_11: New.
+ * gfortran.dg/dummy_procedure_11.f90: New.
Copyright (C) 2015 Free Software Foundation, Inc.
diff --git a/gcc/testsuite/gfortran.dg/extends_16.f90 b/gcc/testsuite/gfortran.dg/extends_16.f90
new file mode 100644
index 0000000..376fcaa
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/extends_16.f90
@@ -0,0 +1,25 @@
+! { dg-do run }
+!
+! PR 57562: [OOP] ICE due to extended derived type with PARAMETER attribute
+!
+! Contributed by <helvio.vairinhos@gmail.com>
+
+ type :: Parent
+ integer :: member1 = 0
+ end type
+
+ type, extends(Parent) :: Child
+ integer :: member2 = 0
+ end type
+
+ type, extends(Child) :: Grandchild
+ integer :: member3 = 0
+ end type
+
+ type(Grandchild), parameter :: object = Grandchild(23, 42, -99)
+
+ if (object%member1 /= 23) call abort
+ if (object%member2 /= 42) call abort
+ if (object%member3 /= -99) call abort
+
+end