1! Copyright 2019-2023 Free Software Foundation, Inc.
2!
3! This program is free software; you can redistribute it and/or modify
4! it under the terms of the GNU General Public License as published by
5! the Free Software Foundation; either version 3 of the License, or
6! (at your option) any later version.
7!
8! This program is distributed in the hope that it will be useful,
9! but WITHOUT ANY WARRANTY; without even the implied warranty of
10! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11! GNU General Public License for more details.
12!
13! You should have received a copy of the GNU General Public License
14! along with this program.  If not, see <http://www.gnu.org/licenses/> .
15
16module container
17    implicit none
18    integer :: a
19    contains
20    subroutine print_from_module()
21       print *, "hello."
22    end subroutine
23end module
24
25program contains_keyword
26    use container
27    implicit none
28    integer :: program_i, program_j
29    program_j = 12 ! pre_init
30    program_i = 7
31    program_j = increment(program_j) ! pre_increment
32    program_i = increment_program_global() ! pre_increment_program_global
33    call subroutine_to_call()
34    call step() ! pre_step
35    call hidden_variable()
36    call print_from_module()
37    print '(I2)', program_j, program_i ! post_init
38
39contains
40    subroutine subroutine_to_call()
41       print *, "called"
42    end subroutine
43    integer function increment(i)
44       integer :: i
45       increment = i + 1
46       print *, i ! post_increment
47    end function
48    integer function increment_program_global()
49       increment_program_global = program_i + 1
50       ! Need to put in a dummy print here to break on as on some systems the
51       ! variables leave scope at "end function", but on others they do not.
52       print *, program_i ! post_increment_global
53    end function
54    subroutine step()
55       print '(A)', "step" ! post_step
56    end subroutine
57    subroutine hidden_variable()
58       integer :: program_i
59       program_i = 30
60       print *, program_i ! post_hidden
61    end subroutine
62end program contains_keyword
63