From 117a714e215404112a424b73ab247724f5e2cce9 Mon Sep 17 00:00:00 2001 From: Janus Weil Date: Sat, 24 Oct 2009 18:50:41 +0200 Subject: [PATCH] re PR fortran/41784 ([OOP] ICE in load_derived_extensions) 2009-10-24 Janus Weil Paul Thomas PR fortran/41784 * module.c (load_derived_extensions): Skip symbols which are not being loaded. 2009-10-24 Janus Weil PR fortran/41784 * gfortran.dg/extends_8.f03: New test. Co-Authored-By: Paul Thomas From-SVN: r153534 --- gcc/fortran/ChangeLog | 7 ++++++ gcc/fortran/module.c | 29 +++++++++++++++++-------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/extends_8.f03 | 17 +++++++++++++++ 4 files changed, 49 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/extends_8.f03 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index cf6c8cd2dcb..c97733c7c4f 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2009-10-24 Janus Weil + Paul Thomas + + PR fortran/41784 + * module.c (load_derived_extensions): Skip symbols which are not being + loaded. + 2009-10-24 Paul Thomas PR fortran/41772 diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c index 2112d3e82b1..b2ad6ecc477 100644 --- a/gcc/fortran/module.c +++ b/gcc/fortran/module.c @@ -3994,6 +3994,14 @@ load_derived_extensions (void) info = get_integer (symbol); derived = info->u.rsym.sym; + /* This one is not being loaded. */ + if (!info || !derived) + { + while (peek_atom () != ATOM_RPAREN) + skip_list (); + continue; + } + gcc_assert (derived->attr.flavor == FL_DERIVED); if (derived->f2k_derived == NULL) derived->f2k_derived = gfc_get_namespace (NULL, 0); @@ -4008,16 +4016,19 @@ load_derived_extensions (void) nuse = number_use_names (name, false); j = 1; p = find_use_name_n (name, &j, false); - st = gfc_find_symtree (gfc_current_ns->sym_root, p); - dt = st->n.sym; - st = gfc_find_symtree (derived->f2k_derived->sym_root, name); - if (st == NULL) + if (p) { - /* Only use the real name in f2k_derived to ensure a single - symtree. */ - st = gfc_new_symtree (&derived->f2k_derived->sym_root, name); - st->n.sym = dt; - st->n.sym->refs++; + st = gfc_find_symtree (gfc_current_ns->sym_root, p); + dt = st->n.sym; + st = gfc_find_symtree (derived->f2k_derived->sym_root, name); + if (st == NULL) + { + /* Only use the real name in f2k_derived to ensure a single + symtree. */ + st = gfc_new_symtree (&derived->f2k_derived->sym_root, name); + st->n.sym = dt; + st->n.sym->refs++; + } } mio_rparen (); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 178af56dde0..99c187ead9c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-10-24 Janus Weil + + PR fortran/41784 + * gfortran.dg/extends_8.f03: New test. + 2009-10-24 Eric Botcazou * gnat.dg/specs/pack4.ads: New test. diff --git a/gcc/testsuite/gfortran.dg/extends_8.f03 b/gcc/testsuite/gfortran.dg/extends_8.f03 new file mode 100644 index 00000000000..4af5ab9327c --- /dev/null +++ b/gcc/testsuite/gfortran.dg/extends_8.f03 @@ -0,0 +1,17 @@ +! { dg-do compile } +! +! PR 41784: [OOP] ICE in load_derived_extensions +! +! Contributed by Salvatore Filippone + +module m + type :: A + end type + type, extends(A) :: B + end type +end module + +use m, only: A +end + +! { dg-final { cleanup-modules "m" } }