This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Patch, Fortran] PR30973, disallow to reuse a module name or to use the module name on an ONLY clause of USE
- From: Tobias Burnus <burnus at net-b dot de>
- To: "'fortran at gcc dot gnu dot org'" <fortran at gcc dot gnu dot org>, gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Tue, 27 Feb 2007 18:40:41 +0100
- Subject: [Patch, Fortran] PR30973, disallow to reuse a module name or to use the module name on an ONLY clause of USE
:ADDPATCH fortran:
As Daniel Franke found out, the following gives no error:
PROGRAM test_foo
USE foo, ONLY: x
INTEGER :: foo
foo = 1
END PROGRAM
as the module name does not get imported as symbol as soon as "ONLY:" is
specified (incl. zero symbols after only).
In addition, using
USE mymod, only: mymod
is possible as is
USE mymod, only: foo => mymod
and
USE mymod, only: mymod => foo
The first two plainly make no sense. The third one has ambiguity problems.
Tobias
2007-02-27 Tobias Burnus <burnus@net-b.de>
PR fortran/30973
* module.c (read_module): Always import module name as symbol.
(gfc_match_use): Disallow module name in the only clause of
a use statement.
2007-02-27 Tobias Burnus <burnus@net-b.de>
PR fortran/30973
* gfortran.dg/use_4.f90: New test.
Index: gcc/fortran/module.c
===================================================================
*** gcc/fortran/module.c (revision 122377)
--- gcc/fortran/module.c (working copy)
*************** gfc_match_use (void)
*** 619,624 ****
--- 619,632 ----
goto cleanup;
}
+ if (strcmp (new->use_name, module_name) == 0
+ || strcmp (new->local_name, module_name) == 0)
+ {
+ gfc_error ("The name '%s' at %C has already been used as "
+ "an external module name.", module_name);
+ goto cleanup;
+ }
+
break;
case INTERFACE_USER_OP:
*************** read_module (void)
*** 3438,3443 ****
--- 3446,3454 ----
/* Get the jth local name for this symbol. */
p = find_use_name_n (name, &j);
+ if (p == NULL && strcmp (name, module_name) == 0)
+ p = name;
+
/* Skip symtree nodes not in an ONLY clause, unless there
is an existing symtree loaded from another USE
statement. */
Index: gcc/testsuite/gfortran.dg/use_4.f90
===================================================================
*** gcc/testsuite/gfortran.dg/use_4.f90 (revision 0)
--- gcc/testsuite/gfortran.dg/use_4.f90 (revision 0)
***************
*** 0 ****
--- 1,33 ----
+ ! { dg-do "compile" }
+ ! PR fortran/30973
+ ! Using symbols with the name of the module
+
+ module foo
+ integer :: i
+ end module foo
+
+ module bar
+ integer :: j
+ end module bar
+
+ module test
+ use foo, only:
+ integer :: foo ! { dg-error "cannot have a type" }
+ end module test
+
+ module test2
+ use bar, only: foo => j
+ use foo ! ok, unless foo is accessed
+ end module test2
+
+ module test3
+ use bar, only: foo => j
+ use foo ! ok, unless foo is accessed
+ foo = 5 ! { dg-error "is an ambiguous reference to 'j'" }
+ end module test3
+
+ program test_foo
+ use foo, only: foo ! { dg-error "been used as an external module name" }
+ use foo, only: i => foo! { dg-error "been used as an external module name" }
+ use foo, only: foo => i! { dg-error "been used as an external module name" }
+ end program