# Copyright (C) 1992, 1997, 2001, 2007-2012 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 return.exp "return"] } {
    return -1
}

proc return_tests { } {
    global gdb_prompt


    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" ".*" "break func2"
    gdb_test "break func3" ".*" "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 ![target_info exists gdb,skip_float_tests] {
	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
