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

# Exercise passing and returning arguments in Fortran. This test case
# is based on the GNU Fortran Argument passing conventions.

require allow_fortran_tests

standard_testfile ".f90"

if {[prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} {debug f90}]} {
    return -1
}

with_complaints 5 {
    set cmd "maint expand-symtabs $srcfile"
    set cmd_regexp [string_to_regexp $cmd]
    set re_kfail [concat "During symbol reading:" \
		      " unable to find array range"]
    gdb_test_multiple $cmd "no complaints in srcfile" {
	-re -wrap "$re_kfail.*" {
	    kfail symtab/27388 $gdb_test_name
	}
        -re "^$cmd_regexp\r\n$gdb_prompt $" {
	    pass $gdb_test_name
	}
    }
}

if {![runto [gdb_get_line_number "post_init"]]} {
    return
}

# Use inspired by gdb.base/callfuncs.exp.
gdb_test_no_output "set unwind-on-signal on"

# Baseline: function and subroutine call with no arguments.
gdb_test "p no_arg()" " = .TRUE."
gdb_test_no_output "call no_arg_subroutine()"

# Argument class: literal, inferior variable, convenience variable,
# function call return value, function.
# Paragraph 3: Variables are passed by reference.
gdb_test "p one_arg(.TRUE.)" " = .TRUE."
gdb_test "p one_arg(untrue)" " = .FALSE."
gdb_test_no_output "set \$var = .FALSE."
gdb_test "p one_arg(\$var)" " = .FALSE."
gdb_test "p one_arg(one_arg(.TRUE.))" " = .TRUE."
gdb_test "p one_arg(one_arg(.FALSE.))" " = .FALSE."
gdb_test_no_output "call run(no_arg_subroutine)"

# Return: constant.
gdb_test "p return_constant()" " = 17"
# Return derived type and call a function in a module.
gdb_test "p derived_types_and_module_calls::build_cart(7,8)" \
	 " = \\\( x = 7, y = 8 \\\)"

# Two hidden arguments. 1. returned string and 2. string length.
# Paragraph 1.
gdb_test "p return_string(returned_string_debugger, 40)" ""
gdb_test "p returned_string_debugger" "'returned in hidden first argument       '"

# Argument type: real(kind=4), complex, array, pointer, derived type,
# derived type with allocatable, nested derived type.
# Paragraph 4: pointer.
gdb_test "p pointer_function(int_pointer)" " = 87"
# Paragraph 4: array.
gdb_test "call array_function(integer_array)" " = 17"
gdb_test "p derived_types_and_module_calls::pass_cart(c)" \
	 " = \\\( x = 2, y = 4 \\\)"
# Allocatable elements in a derived type. Technical report ISO/IEC 15581.
gdb_test "p derived_types_and_module_calls::pass_cart_nd(c_nd)" " = 4"
gdb_test "p derived_types_and_module_calls::pass_nested_cart(nested_c)" \
	  "= \\\( d = \\\( x = 1, y = 2 \\\), z = 3 \\\)"
# Result within some tolerance.
gdb_test "p real4_argument(real4)" " = 3.${decimal}"

# Paragraph 2. Complex argument and return.
gdb_test "p complex_argument(fft)" " = \\\(2.${decimal},3.${decimal}\\\)"

# Function with optional arguments.
# Paragraph 10: Option reference arguments.
gdb_test "p sum_some(1,2,3)" " = 6"

# There is currently no mechanism to call a function without all
# optional parameters present.
setup_kfail "gdb/24147" *-*-*
gdb_test "p sum_some(1,2)" " = 3"

# Paragraph 10: optional value arguments. There is insufficient DWARF
# information to reliably make this case work.
if { [test_compiler_info {gfortran-*} f90] } {
    setup_kfail "gdb/24305" *-*-*
}
gdb_test "p one_arg_value(10)" " = 10"

# DW_AT_artificial formal parameters must be passed manually. This
# assert will fail if the length of the string is wrapped in a pointer.
# Paragraph 7: Character type.
gdb_test "p hidden_string_length('arbitrary string', 16)" " = 16"

# Several arguments.
gdb_test "p several_arguments(2, 3, 5)" " = 10"
gdb_test "p mix_of_scalar_arguments(5, .TRUE., 3.5)" " = 9"

# Calling other functions: Recursive call.
gdb_test "p fibonacci(6)" " = 8"
