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,