# 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/>.

# 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 ![fortran_runto_main] then {
    perror "couldn't run to main"
    continue
}

set integer4 [fortran_int4]
set logical4 [fortran_logical4]
set integer8 [fortran_int8]

# A fortran string parameter is passed as a char *, and an additional
# argument str_ for the string length.  The type used for the string length
# argument is size_t, but for gcc 7 and earlier, the actual type is int
# instead ( see
# https://gcc.gnu.org/onlinedocs/gfortran/Argument-passing-conventions.html ).
set stringlen ($integer8|$integer4)

if {[test_compiler_info {clang-*}]} {
    set some_module_class_type "Type number"
    set some_module_aux_info ", $integer8 \\(10\\)"
} else {
    set some_module_class_type "Type __class_some_module_Number(_t)?"
    set some_module_aux_info ""
}

gdb_test "ptype some_module::get_number" \
    "type = $integer4 \\(${some_module_class_type}${some_module_aux_info}\\)"

gdb_test "ptype some_module::set_number" \
    "type = void \\(${some_module_class_type}, $integer4${some_module_aux_info}\\)"

gdb_test "ptype is_bigger" \
    "type = $logical4 \\($integer4, $integer4\\)"

gdb_test "ptype say_numbers" \
    "type = void \\($integer4, $integer4, $integer4\\)"

set fun_ptr_arg "$integer4"
if {[test_compiler_info {gcc-*}]} {
    set fun_ptr_arg "REF TO -> \\( ${fun_ptr_arg} \\)"
}

gdb_test "ptype fun_ptr" \
    "type = PTR TO -> \\( $integer4 \\(\\) \\(${fun_ptr_arg}\\) \\)"

gdb_test "ptype say_string" \
    "type = void \\(character\[^,\]+, $stringlen\\)"

set say_array_artificial_first_arg ""
if {[test_compiler_info {clang-*}]} {
    set say_array_artificial_first_arg "$integer8, "
}

gdb_test "ptype say_array" \
    "type = void \\(${say_array_artificial_first_arg}$integer4 \\(:,:\\)\\)"
