Tobias Burnus - [Patch, Fortran] PR30973, disallow to reuse a module name or to use the (original) (raw)
This is the mail archive of the gcc-patches@gcc.gnu.orgmailing list for the GCC project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
- From: Tobias Burnus
- To: "'fortran at gcc dot gnu dot org'" , gcc-patches
- 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
- Follow-Ups:
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |