From 74a1c62fca5ca93ae932ac76ca442660d9c78c3a Mon Sep 17 00:00:00 2001
From: Janus Weil <janus@gcc.gnu.org>
Date: Fri, 2 Jan 2015 17:31:52 +0100
Subject: [PATCH] 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
---
 gcc/fortran/ChangeLog                    |  5 +++++
 gcc/fortran/expr.c                       | 19 ++++++++++++++----
 gcc/testsuite/ChangeLog                  |  7 ++++++-
 gcc/testsuite/gfortran.dg/extends_16.f90 | 25 ++++++++++++++++++++++++
 4 files changed, 51 insertions(+), 5 deletions(-)
 create mode 100644 gcc/testsuite/gfortran.dg/extends_16.f90

diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index ea72687383f6..9c88eb8ead69 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 51f527dad122..2d85092865f3 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 095b09d80e37..5fc092e9acf3 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 000000000000..376fcaae49d4
--- /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
-- 
GitLab