File: class_17.f90

package info (click to toggle)
lfortran 0.58.0-4
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 54,512 kB
  • sloc: cpp: 162,179; f90: 68,251; python: 17,476; ansic: 6,278; yacc: 2,334; sh: 1,317; fortran: 892; makefile: 33; javascript: 15
file content (99 lines) | stat: -rw-r--r-- 2,950 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
module class_17_mod
    implicit none
    type :: type_pass
        integer :: value
        contains

        procedure :: set_value_pass
        generic :: set_value => set_value_pass
    end type

    type :: type_no_pass
        integer :: value
        contains

        procedure, nopass :: set_value_no_pass, set_value_no_pass_no_obj
        generic :: set_value => set_value_no_pass, set_value_no_pass_no_obj
    end type

    contains

    subroutine set_value_pass(this, value)
        class(type_pass), intent(inout) :: this
        integer, intent(in) :: value
        this%value = 2 * value
    end subroutine

    subroutine set_value_no_pass(obj, value)
        class(type_no_pass), intent(inout) :: obj
        integer, intent(in) :: value
        obj%value = value
    end subroutine

    subroutine set_value_no_pass_no_obj(value)
        integer, intent(inout) :: value
        value = 25
    end subroutine
end module

program class_17
    use class_17_mod
    implicit none
    integer :: value

    type(type_pass) :: obj_pass
    type(type_no_pass) :: obj_no_pass

    obj_pass%value = 42

    ! below tests show different calls to the same
    ! GenericProcedure (actually the same StructMethodDeclaration)
    ! case 1. passed as argument
    call obj_pass%set_value(45)
    print *, "obj_pass%value: ", obj_pass%value
    if (obj_pass%value /= 90) error stop
    ! case 2. passed as kwarg
    call obj_pass%set_value(value=50)
    print *, "obj_pass%value: ", obj_pass%value
    if (obj_pass%value /= 100) error stop


    obj_no_pass%value = 42
    ! below tests show different calls to the same
    ! GenericProcedure (actually the same StructMethodDeclaration)
    ! case 1. both are arguments
    call obj_no_pass%set_value(obj_no_pass, 5)
    print *, "obj_no_pass%value: ", obj_no_pass%value
    if (obj_no_pass%value /= 5) error stop

    ! case 2. first is argument, second is kwarg
    call obj_no_pass%set_value(obj_no_pass, value=10)
    print *, "obj_no_pass%value: ", obj_no_pass%value
    if (obj_no_pass%value /= 10) error stop

    ! case 3. both are kwargs
    call obj_no_pass%set_value(obj=obj_no_pass, value=11)
    print *, "obj_no_pass%value: ", obj_no_pass%value
    if (obj_no_pass%value /= 11) error stop

    ! case 4. both are kwargs, but position interchanged
    call obj_no_pass%set_value(value=64, obj=obj_no_pass)
    print *, "obj_no_pass%value: ", obj_no_pass%value
    if (obj_no_pass%value /= 64) error stop


    value = 10
    ! below tests show different calls to the same
    ! GenericProcedure (actually the same StructMethodDeclaration),
    ! which accepts only one argument
    ! case 1. passed as argument
    call obj_no_pass%set_value(value)
    print *, "value: ", value
    if (value /= 25) error stop

    value = 30
    ! case 2. passed as kwarg
    call obj_no_pass%set_value(value=value)
    print *, "value: ", value
    if (value /= 25) error stop
end program class_17