From 91480ff35011b73b2debcea1d88090d9165473aa Mon Sep 17 00:00:00 2001 From: Mikael Morin Date: Sun, 8 Feb 2015 14:18:16 +0000 Subject: [PATCH] Use the local name instead of the original name in the check for name conflicts... Use the local name instead of the original name in the check for name conflicts between a hosting program unit and use-associated symbols in that program unit. fortran/ PR fortran/63744 * module.c (check_for_ambiguous): Change argument type from gfc_symbol to gfc_symtree. Check local (symtree) name instead of original (symbol) name. (read_module): Update caller. testsuite/ PR fortran/63744 gfortran.dg/use_rename_8.f90: New. From-SVN: r220515 --- gcc/fortran/ChangeLog | 8 ++++ gcc/fortran/module.c | 10 +++-- gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gfortran.dg/use_rename_8.f90 | 50 ++++++++++++++++++++++ 4 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/use_rename_8.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 36772ab5115..a884220f21f 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2015-02-08 Mikael Morin + + PR fortran/63744 + * module.c (check_for_ambiguous): Change argument type + from gfc_symbol to gfc_symtree. Check local (symtree) name + instead of original (symbol) name. + (read_module): Update caller. + 2015-02-06 Paul Thomas PR fortran/63205 diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c index df612ae953a..b12f8247a91 100644 --- a/gcc/fortran/module.c +++ b/gcc/fortran/module.c @@ -4795,19 +4795,21 @@ read_cleanup (pointer_info *p) /* It is not quite enough to check for ambiguity in the symbols by the loaded symbol and the new symbol not being identical. */ static bool -check_for_ambiguous (gfc_symbol *st_sym, pointer_info *info) +check_for_ambiguous (gfc_symtree *st, pointer_info *info) { gfc_symbol *rsym; module_locus locus; symbol_attribute attr; + gfc_symbol *st_sym; - if (gfc_current_ns->proc_name && st_sym->name == gfc_current_ns->proc_name->name) + if (gfc_current_ns->proc_name && st->name == gfc_current_ns->proc_name->name) { gfc_error ("%qs of module %qs, imported at %C, is also the name of the " - "current program unit", st_sym->name, module_name); + "current program unit", st->name, module_name); return true; } + st_sym = st->n.sym; rsym = info->u.rsym.sym; if (st_sym == rsym) return false; @@ -5037,7 +5039,7 @@ read_module (void) if (st != NULL) { /* Check for ambiguous symbols. */ - if (check_for_ambiguous (st->n.sym, info)) + if (check_for_ambiguous (st, info)) st->ambiguous = 1; else info->u.rsym.symtree = st; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 878338960ce..685715f824e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-02-08 Mikael Morin + + PR fortran/63744 + gfortran.dg/use_rename_8.f90: New. + 2015-02-08 Eric Botcazou * gnat.dg/addr7.ad[sb]: New test. diff --git a/gcc/testsuite/gfortran.dg/use_rename_8.f90 b/gcc/testsuite/gfortran.dg/use_rename_8.f90 new file mode 100644 index 00000000000..ad3ab3977c5 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/use_rename_8.f90 @@ -0,0 +1,50 @@ +! { dg-do compile } +! +! PR fortran/63744 +! duplicate use rename used to be rejected when the target name +! was that of the current program unit +! +! Original testcase from Roger Ferrer Ibanez + +MODULE MOO + INTEGER :: A, B, C, D, E, F, G, H, I +END MODULE MOO + +SUBROUTINE S + USE MOO, ONLY: X => A, X => A +END SUBROUTINE S + +SUBROUTINE T + USE MOO, ONLY: X => B + USE MOO, ONLY: X => B +END SUBROUTINE T + +SUBROUTINE C + USE MOO, ONLY: C ! { dg-error "is also the name of the current program unit" } +END SUBROUTINE C + +SUBROUTINE D + USE MOO, ONLY: X => D +END SUBROUTINE D + +SUBROUTINE E + USE MOO, ONLY: X => E, X => E +END SUBROUTINE E + +SUBROUTINE F + USE MOO, ONLY: X => F + USE MOO, ONLY: X => F +END SUBROUTINE F + +SUBROUTINE X + USE MOO, ONLY: X => G ! { dg-error "is also the name of the current program unit" } +END SUBROUTINE X + +SUBROUTINE Y + USE MOO, ONLY: Y => H ! { dg-error "is also the name of the current program unit" } +END SUBROUTINE Y + +SUBROUTINE Z + USE MOO, ONLY: Z => I, Z => I ! { dg-error "is also the name of the current program unit" } +END SUBROUTINE Z + -- 2.30.2