aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/expr.c
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 /gcc/fortran/expr.c
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
Diffstat (limited to 'gcc/fortran/expr.c')
-rw-r--r--gcc/fortran/expr.c19
1 files changed, 15 insertions, 4 deletions
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;