! Copyright 2019-2021 Free Software Foundation, Inc.
!
! This program is free software; you can redistribute it and/or modify
! it under the terms of the GNU General Public License as published by
! the Free Software Foundation; either version 3 of the License, or
! (at your option) any later version.
!
! This program is distributed in the hope that it will be useful,
! but WITHOUT ANY WARRANTY; without even the implied warranty of
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
! GNU General Public License for more details.
!
! You should have received a copy of the GNU General Public License
! along with this program.  If not, see <http://www.gnu.org/licenses/> .

module container
    implicit none
    integer :: a
    contains
    subroutine print_from_module()
       print *, "hello."
    end subroutine
end module

program contains_keyword
    use container
    implicit none
    integer :: program_i, program_j
    program_j = 12 ! pre_init
    program_i = 7
    program_j = increment(program_j) ! pre_increment
    program_i = increment_program_global() ! pre_increment_program_global
    call subroutine_to_call()
    call step() ! pre_step
    call hidden_variable()
    call print_from_module()
    print '(I2)', program_j, program_i ! post_init

contains
    subroutine subroutine_to_call()
       print *, "called"
    end subroutine
    integer function increment(i)
       integer :: i
       increment = i + 1
       print *, i ! post_increment
    end function
    integer function increment_program_global()
       increment_program_global = program_i + 1
       ! Need to put in a dummy print here to break on as on some systems the
       ! variables leave scope at "end function", but on others they do not.
       print *, program_i ! post_increment_global
    end function
    subroutine step()
       print '(A)', "step" ! post_step
    end subroutine
    subroutine hidden_variable()
       integer :: program_i
       program_i = 30
       print *, program_i ! post_hidden
    end subroutine
end program contains_keyword
