[Bug fortran/85395] New: [7/8] F03 private clause contained in derived type acquires spurious scope
cfd@mnet-mail.de
gcc-bugzilla@gcc.gnu.org
Fri Apr 13 14:36:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85395
Bug ID: 85395
Summary: [7/8] F03 private clause contained in derived type
acquires spurious scope
Product: gcc
Version: 8.0.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
Assignee: unassigned at gcc dot gnu.org
Reporter: cfd@mnet-mail.de
Target Milestone: ---
The following valid Fortran2003 sample code fails to compile with gfortran
7.2.0/8.0.1, apparently because the private clause contained in derived
type "base2" obtains a spurious scope and affects the declaration of
variables in the (subsequently defined) derived type "options":
$ cat scope.f90
module defs
implicit none
private
public :: base2, options
abstract interface
subroutine proc( res,a )
real(8), dimension(:,:), intent(out) :: res
real(8), dimension(:,:), intent(in) :: a
end subroutine proc
end interface
type, abstract :: base1
contains
end type base1
type, abstract :: base2
contains
! This private clause acquires spurious scope
private
end type base2
type, abstract, extends(base1) :: options
procedure(proc), pointer, nopass :: ptr1
procedure(proc), pointer, nopass :: ptr2
contains
end type options
end module defs
module setup
use defs, only: options
implicit none
private
public :: settings
type, extends(options) :: settings
contains
procedure :: init
end type settings
contains
subroutine init(self)
class(settings) :: self
! initialize procedure pointers
self%ptr1 => null()
self%ptr2 => null()
end subroutine init
end module setup
Trying to compile this gives:
$ gfortran8 -c scope.f90
scope.f90:53:15:
self%ptr1 => null()
1
Error: Component ‘ptr1’ at (1) is a PRIVATE component of ‘options’
scope.f90:54:15:
self%ptr2 => null()
1
Error: Component ‘ptr2’ at (1) is a PRIVATE component of ‘options’
Presently the only ways to get the above code to compile with gfortran
are by
i) deleting the aforementioned private clause, or
ii) explicitly declaring the procedure pointers in type options as "public".
The original code compiles fine with pgfortran 17.4 and flang 6.0.
Gfortran version 8.0.1 used is:
Using built-in specs.
COLLECT_GCC=/home/kk/Gcc-8/bin/gfortran8
COLLECT_LTO_WRAPPER=/home/kk/Gcc-8/bin/../libexec/gcc/x86_64-pc-linux-gnu/8.0.1/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../configure --disable-checking
--enable-languages=c,c++,fortran --disable-multilib --enable-multiarch
--enable-shared --enable-threads=posix --program-suffix=8
--with-gmp=/usr/local/lib --with-mpc=/usr/lib --with-mpfr=/usr/lib
--without-included-gettext --with-system-zlib --with-tune=generic
--prefix=/home/kk/GCC-8
Thread model: posix
gcc version 8.0.1 20180409 (experimental) (GCC)
More information about the Gcc-bugs
mailing list