File: submodule_01.f90

package info (click to toggle)
lfortran 0.45.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 46,332 kB
  • sloc: cpp: 137,068; f90: 51,260; python: 6,444; ansic: 4,277; yacc: 2,285; fortran: 806; sh: 524; makefile: 30; javascript: 15
file content (103 lines) | stat: -rw-r--r-- 2,327 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
! Submodules test, taken from:
! https://www.ibm.com/docs/en/xl-fortran-aix/15.1.3?topic=techniques-submodules-fortran-2008
MODULE m1
  TYPE Base
    INTEGER :: i
  END TYPE

  INTERFACE
    MODULE SUBROUTINE sub1(i, b)   ! Module procedure interface body for sub1
      INTEGER, INTENT(IN) :: i
      TYPE(Base), INTENT(IN) :: b
    END SUBROUTINE
  END INTERFACE
END MODULE

MODULE m2
  USE m1                           ! Use association of module m1

  INTERFACE
    REAL MODULE FUNCTION func1()   ! Module procedure interface body for func1
    END FUNCTION

    MODULE FUNCTION func2(b)       ! Module procedure interface body for func2
      TYPE(Base) :: b
      TYPE(Base) :: func2
    END FUNCTION
  END INTERFACE
END MODULE

MODULE m4
  USE m1                           ! Use association of module m1
  TYPE, EXTENDS(Base) :: NewType
    REAL :: j
  END TYPE
END MODULE

SUBMODULE (m1) m1sub
  USE m4                           ! Use association of module m4

  CONTAINS
    MODULE SUBROUTINE sub1(i, b)   ! Implementation of sub1 declared in m1
      INTEGER, INTENT(IN) :: i
      TYPE(Base), INTENT(IN) :: b
      PRINT *, "sub1", i, b
    END SUBROUTINE
END SUBMODULE

SUBMODULE (m2) m2sub

  CONTAINS
    REAL MODULE FUNCTION func1()   ! Implementation of func1 declared in m2
      func1 = 20
    END FUNCTION
END SUBMODULE

SUBMODULE (m2:m2sub) m2sub2

  CONTAINS
    MODULE FUNCTION func2(b)       ! Implementation of func2 declared in m2
      TYPE(Base) :: b
      TYPE(Base) :: func2
      func2 = b
    END FUNCTION
END SUBMODULE

MODULE m3
  INTERFACE
    SUBROUTINE interfaceSub1(i, b)
      USE m1
      INTEGER, INTENT(IN) :: i
      TYPE(Base), INTENT(IN) :: b
    END SUBROUTINE

    REAL FUNCTION interfaceFunc1()
    END FUNCTION

    FUNCTION interfaceFunc2(b)
      USE m1
      TYPE(Base) :: b
      TYPE(Base) :: interfaceFunc2
    END FUNCTION
  END INTERFACE

  TYPE Container
    PROCEDURE(interfaceSub1), NOPASS, POINTER :: pp1
    PROCEDURE(interfaceFunc1), NOPASS, POINTER :: pp2
    PROCEDURE(interfaceFunc2), NOPASS, POINTER :: pp3
  END TYPE
END MODULE

PROGRAM example
  USE m1
  USE m2
  USE m3
  TYPE(Container) :: c1
  c1%pp1 => sub1
  c1%pp2 => func1
  c1%pp3 => func2

  CALL c1%pp1(10, Base(11))
  PRINT *, "func1", int(c1%pp2())
  PRINT *, "func2", c1%pp3(Base(5))
END PROGRAM