MODULE ModMain ! This module contains routines to illustrate internal compiler errors. IMPLICIT NONE ! Enforce explicit typing of all variables PUBLIC :: Proc_Main_I PUBLIC :: Proc_Main_II PRIVATE ABSTRACT INTERFACE !---------------------------------------------------------------------- FUNCTION Proc_CB_ABST(ByteArr, Offset) RESULT(Res) !^ an abstract procedure for callback routines. IMPORT INTEGER(KIND=1), INTENT(IN) :: ByteArr(0:) INTEGER, INTENT(IN) :: Offset INTEGER(KIND=8) :: Res END FUNCTION Proc_CB_ABST !---------------------------------------------------------------------- END INTERFACE INTERFACE !---------------------------------------------------------------------- MODULE FUNCTION Proc_Main_I(Input, Algo) RESULT(Output) !^ main procedure I. INTEGER(KIND=1), INTENT(IN) :: Input(:) INTEGER, INTENT(IN) :: Algo INTEGER(KIND=8) :: Output END FUNCTION !---------------------------------------------------------------------- MODULE FUNCTION Proc_Main_II(Input, Algo) RESULT(Output) !^ main procedure I. INTEGER(KIND=1), INTENT(IN) :: Input(:) INTEGER, INTENT(IN) :: Algo INTEGER(KIND=8) :: Output END FUNCTION !---------------------------------------------------------------------- END INTERFACE CONTAINS !************************************************************************** FUNCTION MaskI64(ByteVal) RESULT(LongVal) ! arguments INTEGER(KIND=1), INTENT(IN) :: ByteVal INTEGER(KIND=8) :: LongVal ! execution LongVal = IAND(INT(ByteVal, KIND=8), Z'00000000000000FF') RETURN END FUNCTION MaskI64 !************************************************************************** FUNCTION Proc_CB_I(ByteArr, Offset) RESULT(Res) !^ callback routine - implementation#1. ! arguments INTEGER(KIND=1), INTENT(IN) :: ByteArr(0:) INTEGER, INTENT(IN) :: Offset INTEGER(KIND=8) :: Res ! execution Res = 0 CALL MVBITS(MaskI64(ByteArr(Offset)), 0, 8, Res, 0) CALL MVBITS(MaskI64(ByteArr(Offset+1)), 0, 8, Res, 8) CALL MVBITS(MaskI64(ByteArr(Offset+2)), 0, 8, Res, 16) CALL MVBITS(MaskI64(ByteArr(Offset+3)), 0, 8, Res, 24) CALL MVBITS(MaskI64(ByteArr(Offset+4)), 0, 8, Res, 32) CALL MVBITS(MaskI64(ByteArr(Offset+5)), 0, 8, Res, 40) CALL MVBITS(MaskI64(ByteArr(Offset+6)), 0, 8, Res, 48) CALL MVBITS(MaskI64(ByteArr(Offset+7)), 0, 8, Res, 56) RETURN END FUNCTION Proc_CB_I !************************************************************************** FUNCTION Proc_CB_II(ByteArr, Offset) RESULT(Res) !^ callback routine - implementation#2. ! arguments INTEGER(KIND=1), INTENT(IN) :: ByteArr(0:) INTEGER, INTENT(IN) :: Offset INTEGER(KIND=8) :: Res ! execution Res = MaskI64(ByteArr(Offset)) + & SHIFTL(MaskI64(ByteArr(Offset+1)), 8) + & SHIFTL(MaskI64(ByteArr(Offset+2)), 16) + & SHIFTL(MaskI64(ByteArr(Offset+3)), 24) + & SHIFTL(MaskI64(ByteArr(Offset+4)), 32) + & SHIFTL(MaskI64(ByteArr(Offset+5)), 40) + & SHIFTL(MaskI64(ByteArr(Offset+6)), 48) + & SHIFTL(MaskI64(ByteArr(Offset+7)), 56) RETURN END FUNCTION Proc_CB_II !************************************************************************** FUNCTION Proc_CB_III(ByteArr, Offset) RESULT(Res) !^ callback routine - implementation#3. ! arguments INTEGER(KIND=1), INTENT(IN) :: ByteArr(0:) INTEGER, INTENT(IN) :: Offset INTEGER(KIND=8) :: Res Res = TRANSFER([ByteArr(Offset), ByteArr(Offset+1), ByteArr(Offset+2), & ByteArr(Offset+3), ByteArr(Offset+4), ByteArr(Offset+5), & ByteArr(Offset+6), ByteArr(Offset+7)], 0_8) RETURN END FUNCTION Proc_CB_III !************************************************************************** END MODULE ModMain