From fdecbf80705f71143b2ef3e598067b582be95903 Mon Sep 17 00:00:00 2001 From: Paul Thomas Date: Thu, 31 May 2007 07:45:50 +0000 Subject: [PATCH] re PR fortran/32103 (Module with equivalence draws "unsatisfied reference") 2007-05-31 Paul Thomas PR fortran/32103 * module.c (mio_symtree_ref): If an equivalence group member is not used, give it a hidden symbol and set the pointer_info. (load_equiv): Only free the equivalence if none of the members are used. 2007-05-31 Paul Thomas PR fortran/32103 * gfortran.dg/module_equivalence_3.f90: New test. From-SVN: r125216 --- gcc/fortran/ChangeLog | 2 +- gcc/fortran/module.c | 30 +++++++++++---- gcc/testsuite/ChangeLog | 2 +- .../gfortran.dg/module_equivalence_3.f90 | 38 +++++++++++++++++++ 4 files changed, 63 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/module_equivalence_3.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index e61c6e46bf1..a4ebacabfaf 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,4 +1,4 @@ -2007-05-29 Daniel Franke +2007-05-31 Paul Thomas PR fortran/32103 * module.c (mio_symtree_ref): If an equivalence group member is not used, give it a hidden symbol and set the pointer_info. (load_equiv): Only free the equivalence if none of the members are used. 2007-05-29 Daniel Franke * gfortran.h: Renamed 'enum gfc_generic_isym_id' to 'enum gfc_isym_id', added missing GFC_ISYM_* enumerators, ordered alphabetically. diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c index 8a650385597..132de385860 100644 --- a/gcc/fortran/module.c +++ b/gcc/fortran/module.c @@ -189,7 +189,7 @@ static gfc_use_rename *gfc_rename_list; static pointer_info *pi_root; static int symbol_number; /* Counter for assigning symbol numbers */ -/* Tells mio_expr_ref not to load unused equivalence members. */ +/* Tells mio_expr_ref to make symbols for unused equivalence members. */ static bool in_load_equiv; @@ -2234,9 +2234,25 @@ mio_symtree_ref (gfc_symtree **stp) require_atom (ATOM_INTEGER); p = get_integer (atom_int); - /* An unused equivalence member; bail out. */ + /* An unused equivalence member; make a symbol and a symtree + for it. */ if (in_load_equiv && p->u.rsym.symtree == NULL) - return; + { + /* Since this is not used, it must have a unique name. */ + p->u.rsym.symtree = get_unique_symtree (gfc_current_ns); + + /* Make the symbol. */ + if (p->u.rsym.sym == NULL) + { + p->u.rsym.sym = gfc_new_symbol (p->u.rsym.true_name, + gfc_current_ns); + p->u.rsym.sym->module = gfc_get_string (p->u.rsym.module); + } + + p->u.rsym.symtree->n.sym = p->u.rsym.sym; + p->u.rsym.symtree->n.sym->refs++; + p->u.rsym.referenced = 1; + } if (p->type == P_UNKNOWN) p->type = P_SYMBOL; @@ -3206,13 +3222,13 @@ load_equiv (void) mio_expr (&tail->expr); } - /* Unused variables have no symtree. */ - unused = false; + /* Unused equivalence members have a unique name. */ + unused = true; for (eq = head; eq; eq = eq->eq) { - if (!eq->expr->symtree) + if (!check_unique_name (eq->expr->symtree->name)) { - unused = true; + unused = false; break; } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4ebf0027742..045a3369169 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,4 +1,4 @@ -2007-05-30 Russell Yanofsky +2007-05-31 Paul Thomas PR fortran/32103 * gfortran.dg/module_equivalence_3.f90: New test. 2007-05-30 Russell Yanofsky Douglas Gregor Pedro Lamarao Howard Hinnant diff --git a/gcc/testsuite/gfortran.dg/module_equivalence_3.f90 b/gcc/testsuite/gfortran.dg/module_equivalence_3.f90 new file mode 100644 index 00000000000..d646f97407e --- /dev/null +++ b/gcc/testsuite/gfortran.dg/module_equivalence_3.f90 @@ -0,0 +1,38 @@ +! { dg-do run } +! This checks the fix for PR32103 in which not using one member +! of an equivalence group would cause all memory of the equivalence +! to be lost and subsequent incorrect referencing of the remaining +! members. +! +! Contributed by Toon Moene +! +module aap + real :: a(5) = (/1.0,2.0,3.0,4.0,5.0/) + real :: b(3) + real :: d(5) = (/1.0,2.0,3.0,4.0,5.0/) + equivalence (a(3),b(1)) +end module aap + + use aap, only : b + call foo + call bar +! call foobar +contains + subroutine foo + use aap, only : c=>b + if (any(c .ne. b)) call abort () + end subroutine + subroutine bar + use aap, only : a + if (any(a(3:5) .ne. b)) call abort () + end subroutine + +! Make sure that bad things do not happen if we do not USE a or b. + + subroutine foobar + use aap, only : d + if (any(d(3:5) .ne. b)) call abort () + end subroutine +end + +! { dg-final { cleanup-modules "aap" } } -- 2.30.2