FIX: ENTRY Statement Not Recognizing VALUE Attribute

ID: Q85303


The information in this article applies to:
  • Microsoft FORTRAN for MS-DOS, versions 4.0, 4.01, 4.1, 5.0
  • Microsoft FORTRAN for OS/2, versions 4.1, 5.0


SYMPTOMS

A program compiled with Microsoft FORTRAN version 4.0, 4.01, 4.1, or 5.0 may generate incorrect results when it includes a subprogram containing an ENTRY statement. For the problem to occur, one of the arguments of the ENTRY statement must be passed by value. This argument must be a different name than the formal argument declared by the subprogram containing the ENTRY statement.


CAUSE

VALUE attributes are incorrectly ignored in INTERFACE statements for subprograms that have an ENTRY statement if the arguments are not identical. Arguments to ENTRY statements are passed in by the default method, by reference, and the subprogram then generates incorrect results.


RESOLUTION

Use a formal parameter for the ENTRY point that exactly matches the name of the formal parameter of the parent function. In this case the following warning may be generated:

warning F4201: ENTRY : formal argument :attribute VALUE : mismatch
This warning message can be ignored.


STATUS

Microsoft has confirmed this to be a problem in Microsoft FORTRAN versions 4.0, 4.01, 4.1, and 5.0. This problem was corrected in Microsoft FORTRAN version 5.1.


MORE INFORMATION

Sample Code 1

The following code reproduces the problem:

     interface to subroutine t1(v1[value])
      integer*2 v1
      end

      interface to subroutine et1(v1[value])
      integer*2 v1
      end

      print *, 'Passing a 1 to t1()'
      call t1(1)
      print *
      print *, 'Passing a 10 to et1()'
      call et1(10)
      end


      subroutine t1(v1)
      integer*2 v1, ev1

      print *, 'Value received by t1  =',v1
      return
      ENTRY  et1(ev1)
      print *, 'Value received by et1 =',ev1
      return
      end 

Sample Code 2

The following code corrects the problem:

     interface to subroutine t1(v1[value])
      integer*2 v1
      end

      interface to subroutine et1(v1[value])
      integer*2 v1
      end

      print *, 'Passing a 1 to t1()'
      call t1(1)
      print *
      print *, 'Passing a 10 to et1()'
      call et1(10)
      end


      subroutine  t1(v1)
      integer*2 v1

      print *, 'Value received by t1  =',v1
      return
      ENTRY  et1(v1)
      print *, 'Value received by et1 =',v1
      return
      end 

Additional query words: 4.00 4.10 5.00 5.10 buglist4.00 buglist4.10 buglist5.00 fixlist5.10

Keywords :
Version : :4.0,4.01,4.1,5.0
Platform :
Issue type :


Last Reviewed: November 3, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.