https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80554

--- Comment #4 from Paul Thomas <pault at gcc dot gnu.org> ---
(In reply to Tamas Bela Feher from comment #0)
> Created attachment 41281 [details]
> submodule redefines a variable from the ancestor module
> 
> Dear GFortran team,
> 
> In the attached program, module M and its submodule S both define a
> variable with the name i. This triggers an error message in GFortran 6.3.0
> and also in the latest version form SVN trunk.
> 
> The Intel Fortran compiler accepts the code, and the compiled code produces
> the following output:
> ./a.out
>          137
> 
> I think GFortran should also accept the code. As far as I know, entities
> from the ancestor module are host associated, and we should be allowed to
> specify a local entity in the submodule with the same name. Or is there any
> restriction in the standard which forbids it?
> 
> Could you look into this problem? Thank you for your help.
> 
> Best regards,
> Tamas
> 
> 
> $ cat submod_var_scope.f90 
> module M
>   implicit none
>   integer :: i = 0
>   interface
>     module subroutine write_i()
>     end subroutine
>   end interface
> end module
> 
> submodule (M) S
>   integer :: i = 137
>   contains
>     module subroutine write_i()
>        write (*,*) i
>     end subroutine
> end submodule
> 
> program test_submod_variable
>   use M
>   implicit none
>   i = 42
>   call write_i
> end program
> 
> $ gfortran-6 -v submod_var_scope.f90 
> Driving: gfortran-6 -v submod_var_scope.f90 -l gfortran -l m -shared-libgcc
> Using built-in specs.
> COLLECT_GCC=gfortran-6
> COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-pc-linux-gnu/6.3.0/lto-
> wrapper
> Target: x86_64-pc-linux-gnu
> Configured with: ../gcc-6.3.0/configure --program-suffix=-6
> Thread model: posix
> gcc version 6.3.0 (GCC) 
> COLLECT_GCC_OPTIONS='-v' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
>  /usr/local/libexec/gcc/x86_64-pc-linux-gnu/6.3.0/f951 submod_var_scope.f90
> -quiet -dumpbase submod_var_scope.f90 -mtune=generic -march=x86-64 -auxbase
> submod_var_scope -version -fintrinsic-modules-path
> /usr/local/lib/gcc/x86_64-pc-linux-gnu/6.3.0/finclude -o /tmp/ccq0YC9g.s
> GNU Fortran (GCC) version 6.3.0 (x86_64-pc-linux-gnu)
>         compiled by GNU C version 6.3.0, GMP version 6.1.2, MPFR version
> 3.1.3, MPC version 1.0.3, isl version none
> GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
> GNU Fortran2008 (GCC) version 6.3.0 (x86_64-pc-linux-gnu)
>         compiled by GNU C version 6.3.0, GMP version 6.1.2, MPFR version
> 3.1.3, MPC version 1.0.3, isl version none
> GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
> submod_var_scope.f90:11:14:
> 
>    integer :: i = 137
>               1
> Error: Symbol ā€˜i’ at (1) already has basic type of INTEGER
> 
> 
> $ gfortran-svn -v submod_var_scope.f90 
> Driving: gfortran-svn -v submod_var_scope.f90 -l gfortran -l m -shared-libgcc
> Using built-in specs.
> COLLECT_GCC=gfortran-svn
> COLLECT_LTO_WRAPPER=/opt/gcc-svn/libexec/gcc/x86_64-pc-linux-gnu/8.0.0/lto-
> wrapper
> Target: x86_64-pc-linux-gnu
> Configured with: ../gcc-svn-trunk/configure --prefix=/opt/gcc-svn
> --program-suffix=-svn --enable-languages=c,fortran
> Thread model: posix
> gcc version 8.0.0 20170427 (experimental) (GCC) 
> COLLECT_GCC_OPTIONS='-v' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
>  /opt/gcc-svn/libexec/gcc/x86_64-pc-linux-gnu/8.0.0/f951
> submod_var_scope.f90 -quiet -dumpbase submod_var_scope.f90 -mtune=generic
> -march=x86-64 -auxbase submod_var_scope -version -fintrinsic-modules-path
> /opt/gcc-svn/lib/gcc/x86_64-pc-linux-gnu/8.0.0/finclude -o /tmp/ccRu9s2z.s
> GNU Fortran (GCC) version 8.0.0 20170427 (experimental) (x86_64-pc-linux-gnu)
>         compiled by GNU C version 8.0.0 20170427 (experimental), GMP version
> 6.1.2, MPFR version 3.1.3, MPC version 1.0.3, isl version none
> GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096
> GNU Fortran2008 (GCC) version 8.0.0 20170427 (experimental)
> (x86_64-pc-linux-gnu)
>         compiled by GNU C version 8.0.0 20170427 (experimental), GMP version
> 6.1.2, MPFR version 3.1.3, MPC version 1.0.3, isl version none
> GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096
> submod_var_scope.f90:11:14:
> 
>    integer :: i = 137
>               1
> Error: Symbol ā€˜i’ at (1) already has basic type of INTEGER

As you correctly point out, entities from the parent module are host associated
in the submodule. Thus, the message is absolutely correct and the nub is
whether or not this is an error.

Somewhere in the deep and distant past a bug report came up concerning double
declarations of TKR within a scoping unit. The gfortran developers at the time
determined that this was not allowed or, rather, should not be allowed. This is
the reason why gfortran is flagging up an error.

I cannot find anything in the standard that overrides the normal interpretation
of host association in submodules and so I think that you are correct to say
that this is a bug.

I will take it.

Thanks

Paul

Reply via email to