FIX: ENTRY Statement Not Recognizing VALUE Attribute (85303)



The information in this article applies to:

  • Microsoft FORTRAN Compiler for MS-DOS 4.0
  • Microsoft FORTRAN Compiler for MS-DOS 4.01
  • Microsoft FORTRAN Compiler for MS-DOS 4.1
  • Microsoft FORTRAN Compiler for MS-DOS 5.0
  • Microsoft FORTRAN compiler for OS/2 4.1
  • Microsoft FORTRAN compiler for OS/2 5.0

This article was previously published under Q85303

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
				

Modification Type:MajorLast Reviewed:12/1/2003
Keywords:kbfix KB85303