File: interface_16.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 (89 lines) | stat: -rw-r--r-- 1,914 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
! This integration test tests for the comparison of `Var_t` expressions
! at runtime.
!
! The test is framed such that it checks if a variable passed from
! one subroutine to another for setting the dimension of an array works.
!
! The underlying idea is that when a variable is used to set the dimension
! of an array in a subroutine, the passed variable is internally checked for
! equality of expression with the parameter variable. If the variable
! expressions are equal, the program will execute, else it will fail.
!
!
! This means that for a subroutine
!
!    SUBROUTINE subroutine_1 ( arr_1, nx )
!
!       INTEGER, DIMENSION(nx), INTENT(IN) :: arr_1
!
!       INTEGER, INTENT(IN) ::  nx
!
!    END SUBROUTINE subroutine_1
!
! and another subroutine
!
!    SUBROUTINE subroutine_2 ( arr_2, ny )
!
!       INTEGER, DIMENSION(ny):: arr_2
!
!       INTEGER, INTENT(IN) ::  ny
!
!       CALL subroutine_1 ( arr_2, ny )
!
!    END SUBROUTINE subroutine_2
!
!
! the expression type of the argument variable `ny` to `subroutine_1` must be equal to
! the parameter variable `nx`.


MODULE module_interface_16

   INTERFACE sub
      MODULE PROCEDURE subroutine_1
   END INTERFACE sub

CONTAINS

   SUBROUTINE subroutine_1 ( arr_1, nx )

      INTEGER, DIMENSION(nx), INTENT(IN) :: arr_1

      INTEGER, INTENT(IN) ::  nx

      PRINT *, nx
      IF (nx /= 4) ERROR STOP

      PRINT *, arr_1
      IF (all(arr_1 /= [1, 2, 3, 4])) ERROR STOP


   END SUBROUTINE subroutine_1

   SUBROUTINE subroutine_2 ( arr_2, ny )

      INTEGER, DIMENSION(ny):: arr_2

      INTEGER, INTENT(IN) ::  ny

      CALL subroutine_1 ( arr_2, ny )

   END SUBROUTINE subroutine_2

END MODULE module_interface_16


PROGRAM interface_16
   USE module_interface_16
   IMPLICIT NONE

   INTEGER :: n
   INTEGER, DIMENSION(4) :: test_arr

   n = 4
   test_arr = [1, 2, 3, 4]

   CALL subroutine_2( test_arr, n )

END PROGRAM interface_16