gfortran tech support: Following the body of this report is a short program that tests two different ways to override a structure constructor. When I compile it using
GNU Fortran (GCC) 4.6.0 20100606 (experimental) [trunk revision 160350] gfortran reports the following errors: struct_overP.f90:59.23: interface temp_node_t 1 Error: DERIVED attribute of 'temp_node_t' conflicts with PROCEDURE attribute at (1) struct_overP.f90:60.21: module procedure Construct_temp_node_t 1 Error: MODULE PROCEDURE at (1) must be in a generic module interface struct_overP.f90:61.5: end interface 1 Error: Expecting END MODULE statement at (1) struct_overP.f90:93.35: use Temp_node, only : temp_node_t 1 Fatal Error: Can't open module file 'temp_node.mod' for reading at (1): No such file or directory n...@oxford:~/Elements/StructOver$ I am uncertain if this represents a bug or a feature of Fortran 2003 that has yet to be added to gfortran, so I am submitting it as an enhancement. Thank you for you attention. Norm Norman S. Clerman Consulting computer scientist module Rational implicit none private type, public :: rational_t integer :: n = 0, id = 1 contains procedure, nopass :: Construct_rational_t procedure :: Print_rational_t procedure, private :: Rational_t_init generic :: Rational_t => Construct_rational_t generic :: print => Print_rational_t end type rational_t contains function Construct_rational_t (message_) result (return_type) character (*), intent (in) :: message_ type (rational_t) :: return_type print *, trim (message_) call return_type % Rational_t_init end function Construct_rational_t subroutine Print_rational_t (this_) class (rational_t), intent (in) :: this_ print *, "n, id", this_% n, this_% id end subroutine Print_rational_t subroutine Rational_t_init (this_) class (rational_t), intent (in out) :: this_ this_% n = 10 this_% id = 0 end subroutine Rational_t_init end module Rational module Temp_node implicit none private real, parameter :: NOMINAL_TEMP = 20.0 type, public :: temp_node_t real :: temperature = NOMINAL_TEMP integer :: id = 1 contains procedure :: Print_temp_node_t procedure, private :: Temp_node_t_init generic :: Print => Print_temp_node_t end type temp_node_t interface temp_node_t module procedure Construct_temp_node_t end interface contains function Construct_temp_node_t (message_) result (return_type) character (*), intent (in) :: message_ type (temp_node_t) :: return_type print *, trim (message_) call return_type % Temp_node_t_init end function Construct_temp_node_t subroutine Print_temp_node_t (this_) class (temp_node_t), intent (in) :: this_ print *, "temp, id", this_% temperature, this_% id end subroutine Print_temp_node_t subroutine Temp_node_t_init (this_) class (temp_node_t), intent (in out) :: this_ this_% temperature = 10.0 this_% id = 0 end subroutine Temp_node_t_init end module Temp_node program Struct_over use Rational, only : rational_t use Temp_node, only : temp_node_t implicit none type (rational_t) :: sample_rational_t type (temp_node_t) :: sample_temp_node_t print *, "rational_t" print *, "----------" print *, "" print *, "after declaration" call sample_rational_t % print sample_rational_t = sample_rational_t % rational_t ("using override") print *, "after override" ! call print (sample_rational_t) ! call sample_rational_t % print () call sample_rational_t % print print *, "sample_t" print *, "--------" print *, "" print *, "after declaration" call sample_temp_node_t % print sample_temp_node_t = temp_node_t ("using override") print *, "after override" ! call print (sample_rational_t) ! call sample_rational_t % print () call sample_temp_node_t % print end program Struct_over -- Summary: implemention of structure constructor override using a generic interface Product: gcc Version: 4.6.0 Status: UNCONFIRMED Severity: enhancement Priority: P3 Component: fortran AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: clerman at fuse dot net http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45155