# Copyright (C) 1992-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 was written by Jeff Law. (law@cs.utah.edu)

if { [prepare_for_testing "failed to prepare" "return"] } {
    return -1
}

set skip_float_test [gdb_skip_float_test]

proc return_tests { } {
    global gdb_prompt skip_float_test


    if { ! [ runto func1 ] } then { return 0 }

    gdb_test_multiple "return" "simple return" {
	-re "Make .* return now.*y or n. $" {
	    send_gdb "y\n"
	    exp_continue
	}
	-re "func1 ..;.*$gdb_prompt $" {
	    send_gdb "step\n"
	    exp_continue
	}
	-re ".*in main after func1.*$gdb_prompt $" { 
	    pass "simple return" 
	}
    }

    # Set breakpoints in other interesting functions.
    gdb_test "break func2" ".*"
    gdb_test "break func3" ".*"

    gdb_test "continue" "return -5;" "continue to return of -5"

    gdb_test_multiple "return 5" "return value 5" {
	-re "Make .* return now.*y or n. $" {
	    send_gdb "y\n"
	    exp_continue
	}
	-re ".*tmp2 = func2.*$gdb_prompt $" {
	    # pass without comment
	}
    }

    gdb_test "next" "tmp3 = func3.*" "next over call to func2"

    gdb_test "p tmp2" ".* = 5" "correct value returned (integer test)"

    gdb_test "continue" "return -5.0;" "continue to return of -5.0"

    # Return of a double does not work for 68hc11 (need struct return
    # in memory).
    setup_xfail "m6811-*-*"

    gdb_test_multiple "return 5.0" "return value 5.0" {
	-re "Make .* return now.*y or n. $" {
	    send_gdb "y\n"
	    exp_continue
	}
	-re ".*tmp3 = func3.*$gdb_prompt $" {
	    # pass without comment
	}
    }

    setup_xfail "m6811-*-*"
    gdb_test "next" "printf.*" "next over call to func3"

    # This test also fails for sparc Solaris 2.3 & 2.4, but passes under 2.5
    # At the time the `next' is issued, the floating point unit for the
    # process is not yet initialized, and the storing of the floating
    # point value to the floating point return register is ignored.
    # Xfail it for current versions that are known to fail.  Presumably
    # if some future version does initialize the floating point unit at
    # process start, making this test pass, it will be for a version that
    # is not xfailed.

    setup_xfail "sparc-*-solaris2.3*" "sparc-*-solaris2.4*" "m6811-*-*"
    if {!$skip_float_test} {
	gdb_test "p tmp3" ".* = 5.*" \
	    "correct value returned double test (known problem with sparc solaris)"
    }
}

set prev_timeout $timeout
set timeout 30
return_tests
set timeout $prev_timeout
