http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46067

janus at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |accepts-invalid
            Summary|hang or spurious compiler   |[F03] invalid procedure
                   |message using procedure     |pointer assignment not
                   |pointer with pass           |detected

--- Comment #2 from janus at gcc dot gnu.org 2010-10-18 20:08:52 UTC ---
(In reply to comment #1)
> > potential problem 2: if the error message is correct and if the type of the
> > passed-object dummy argument in the sample code is changed from a 
> > declaration
> > of "type" to "class", the module compiles but hangs when the passed-object
> > dummy argument is referenced. 
> 
> After changing the PASS arg from TYPE to CLASS, the module compiles fine for 
> me
> without any hanging (on x86_64-unknown-linux-gnu at r165600).

Ok, one has to be a little careful at this point: When changing both TYPE
declarations into CLASS (inside 'fun_interface' and 'fun1'), the program
compiles ok and apparently gives the correct output (assuming that the
undefined variable 'pi' is zero, contrary to its suggestive name):

  fun1(pi)   id =            1
   1.0000000 

However, when changing only the TYPE declaration in 'fun_interface', but not
the one in 'fun1', the program compiles but gives bogus results:

  fun1(pi)   id =      6295264
   1.0000000

This is due to the fact that the resulting program is invalid, which gfortran
currently fails to detect.

In summary: The only bug that gfortran exhibits in the context of this PR is
the fact that it does not reject the invalid procedure pointer assignment in
the following program:


  implicit none

  type test_type
    integer :: id
    procedure(fun_interface), pointer, pass :: fun_ptr
  end type test_type

  abstract interface
    function fun_interface(t,x) result(res)
      import :: test_type
      real, intent(in) :: x
      class(test_type) :: t
      real :: res
    end function fun_interface
  end interface  

  type(test_type),dimension(1) :: funs

  funs(1)%id = 1
  funs(1)%fun_ptr => fun1                    !!! invalid !!!
  print *, " fun1(pi) ",funs(1)%fun_ptr(0.)

contains

  function fun1 (t,x) result (res)
    real, intent(in) :: x
    type(test_type) :: t
    real :: res
    print *," id = ", t%id
   res=cos(x)
  end function fun1

end

Reply via email to