Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.
29361 Discussions

ICE: type bound procedure in submodule using module

Daniel_Dopico
New Contributor I
118 Views

The following code triggers an ICE. It happens when the size of an output variable in a type-bound procedure defined in a sumbmoudule is related to a type in a different module. It seems, in general part of the mess with host association and sumbmodules.

!MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MODULE mod1
    TYPE basetype_1
        INTEGER::DIM=0
    END TYPE basetype_1

    TYPE type1
        TYPE(basetype_1)::q
    END TYPE type1

    TYPE(type1) varsize
CONTAINS
END MODULE mod1
!MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
!MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MODULE mod2
IMPLICIT NONE

! Base type   
TYPE,ABSTRACT::basetype
CONTAINS
    PROCEDURE(template_fun),PASS,DEFERRED::f1
END TYPE basetype

ABSTRACT INTERFACE
    FUNCTION template_fun(varin)
    use mod1,ONLY:varsize
    IMPORT basetype
        IMPLICIT NONE
        CLASS(basetype),INTENT(IN)::varin
        REAL(8)::template_fun(3,varsize%q%dim)
    END FUNCTION template_fun
END INTERFACE

! Extended type 1
TYPE,EXTENDS(basetype)::extendedtype1
CONTAINS
    PROCEDURE,PASS::f1=>f1_et1
END TYPE extendedtype1

! Extended type 2
TYPE,EXTENDS(basetype)::extendedtype2
CONTAINS
    PROCEDURE,PASS::f1=>f1_et2
END TYPE extendedtype2

INTERFACE
    MODULE FUNCTION f1_et1(varin)
    use mod1,ONLY:varsize
        IMPLICIT NONE
        CLASS(extendedtype1),INTENT(IN)::varin
        REAL(8)::f1_et1(3,varsize%q%dim)
    END FUNCTION f1_et1

    MODULE FUNCTION f1_et2(varin)
    use mod1,ONLY:varsize
        IMPLICIT NONE
        CLASS(extendedtype2),INTENT(IN)::varin
        REAL(8)::f1_et2(3,varsize%q%DIM)
    END FUNCTION f1_et2
END INTERFACE

END MODULE mod2
!MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
!MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
SUBMODULE(mod2) submod
    IMPLICIT NONE
CONTAINS

    MODULE PROCEDURE f1_et1
        f1_et1=0.d0
    END PROCEDURE f1_et1

    MODULE PROCEDURE f1_et2
        f1_et2=0.d0
    END PROCEDURE f1_et2

END SUBMODULE submod
!MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
!PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
PROGRAM MAIN
USE mod2
    TYPE(extendedtype1)::pt
    REAL(8),ALLOCATABLE::qz(:,:)

    qz=pt%f1()

END PROGRAM
!PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP

 

0 Kudos
0 Replies
Reply