diff options
author | Janus Weil <janus@gcc.gnu.org> | 2015-01-02 17:31:52 +0100 |
---|---|---|
committer | Janus Weil <janus@gcc.gnu.org> | 2015-01-02 17:31:52 +0100 |
commit | 74a1c62fca5ca93ae932ac76ca442660d9c78c3a (patch) | |
tree | 1a3c295bbabbdb58c8d6b49ea5948478a94694b0 | |
parent | 09ed8520b912f4455741528556e62cd3cfa8a53d (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/fortran/expr.c | 19 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/extends_16.f90 | 25 |
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
|