Quantcast
Channel: Intel® Software - Intel® Visual Fortran Compiler for Windows*
Viewing all articles
Browse latest Browse all 5691

FINAL binding to an ELEMENTAL procedure does not work: causes "Program Exception - Access Violation"

$
0
0

Consider the simple program shown below:

MODULE m

   !..
   IMPLICIT NONE

   !.. Private by default
   PRIVATE

   TYPE, PUBLIC :: t

      !.. private by default
      PRIVATE

      !.. Private fields
      CHARACTER(LEN=:), ALLOCATABLE :: m_string

   CONTAINS

      !.. Private by default
      PRIVATE
      FINAL :: Clean

      !..
      PROCEDURE, PASS(This), PUBLIC :: Set => Set_String
      PROCEDURE, PASS(This), PUBLIC :: Get => Get_String

   END TYPE t

CONTAINS

   PURE ELEMENTAL SUBROUTINE Set_String(This, NewString)

      !.. Argument list
      CLASS(t), INTENT(INOUT)      :: This
      CHARACTER(LEN=*), INTENT(IN) :: NewString

      !..
      This%m_string = NewString

      RETURN

   END SUBROUTINE Set_String

   PURE ELEMENTAL FUNCTION Get_String(This) RESULT(RetVal)

      !.. Argument list
      CLASS(t), INTENT(IN) :: This
      !.. Function result
      CHARACTER(LEN=:), ALLOCATABLE :: RetVal

      !..
      RetVal = This%m_string

      RETURN

   END FUNCTION Get_String

   PURE ELEMENTAL SUBROUTINE Clean(This)

      !.. Argument list
      TYPE(t), INTENT(INOUT)      :: This

      !.. Local variables
      INTEGER :: Istat

      IF (ALLOCATED(This%m_string)) THEN
         DEALLOCATE(This%m_string, STAT=Istat)
      END IF

      RETURN

   END SUBROUTINE Clean

END MODULE m

PROGRAM p

   USE m, ONLY : t

   IMPLICIT NONE

   !.. Local variables
   TYPE(t), ALLOCATABLE :: foo(:)
   INTEGER :: Istat
   INTEGER, PARAMETER :: MaxElem = 5
   INTEGER :: I
   CHARACTER(LEN=2048) :: ErrDealloc

   !..
   PRINT *, " Test Elemental finalizer "

   ALLOCATE(foo(MaxElem), STAT=Istat)
   IF (Istat /= 0) THEN
      PRINT *, " Error allocating foo."
      STOP
   END IF

   DO I = 1, MaxElem
      CALL foo(I)%Set(" string " // ACHAR(34+I))
      PRINT *, " foo element ",I, " is ",foo(I)%Get()
   END DO

   DEALLOCATE(foo, STAT=Istat, ERRMSG=ErrDealloc)
   IF (Istat /= 0) THEN
      PRINT *, " Error deallocating foo: STAT = ",Istat,", ERRMSG = ", ErrDealloc(1:LEN_TRIM(ErrDealloc))
      STOP
   END IF

   PRINT *, " End Program "

   STOP

END PROGRAM p

 

Upon compilation and execution with Intel Fortran, either compiler version 14 or 2015 Beta, the program fails as follows:

  Test Elemental finalizer
  foo element  1  is  string #
  foo element  2  is  string $
  foo element  3  is  string %
  foo element  4  is  string &
  foo element  5  is  string '
forrtl: severe (157): Program Exception - access violation
Image              PC        Routine            Line        Source
TestFor32.exe      00DA1494  _M_mp_CLEAN@4              66  TestMod.f90
TestFor32.exe      00DB13DA  Unknown               Unknown  Unknown
TestFor32.exe      00DA2467  _MAIN__                    28  TestFor.f90
TestFor32.exe      00E148A2  Unknown               Unknown  Unknown
TestFor32.exe      00E157BA  Unknown               Unknown  Unknown
TestFor32.exe      00E1590D  Unknown               Unknown  Unknown
kernel32.dll       7576338A  Unknown               Unknown  Unknown
ntdll.dll          76F5BF32  Unknown               Unknown  Unknown
ntdll.dll          76F5BF05  Unknown               Unknown  Unknown

 

My understanding is the above is consistent with current Fortran standard and the access violation is due to some bug in the compiler.  Can someone from Intel please investigate and provide feedback?

Thanks,


Viewing all articles
Browse latest Browse all 5691

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>