# Copyright 2019-2020 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/>.

# This file contains a test for printing the types of functions.

if { [skip_fortran_tests] } { return -1 }

standard_testfile .f90
load_lib "fortran.exp"

if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug f90}]} {
    return -1
}

if ![runto MAIN__] then {
    perror "couldn't run to breakpoint MAIN__"
    continue
}

gdb_test "ptype some_module::get_number" \
    "type = integer\\(kind=4\\) \\(Type __class_some_module_Number_t\\)"

gdb_test "ptype some_module::set_number" \
    "type = void \\(Type __class_some_module_Number_t, integer\\(kind=4\\)\\)"

gdb_test "ptype is_bigger" \
    "type = logical\\(kind=4\\) \\(integer\\(kind=4\\), integer\\(kind=4\\)\\)"

gdb_test "ptype say_numbers" \
    "type = void \\(integer\\(kind=4\\), integer\\(kind=4\\), integer\\(kind=4\\)\\)"

gdb_test "ptype fun_ptr" \
    "type = PTR TO -> \\( integer\\(kind=4\\) \\(\\) \\(REF TO -> \\( integer\\(kind=4\\) \\)\\) \\)"
