# Copyright (C) 1992, 1997, 2001, 2007, 2008, 2009, 2010
# 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 }
    send_gdb "return\n"
    gdb_expect {
	-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" }
    -re "$gdb_prompt $" { fail "simple return" }
    timeout { fail "(timeout) 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"
    send_gdb "return 5\n"
    gdb_expect {
	-re "Make .* return now.*y or n. $" {
	    send_gdb "y\n"
	    exp_continue
	}
    -re ".*tmp2 = func2.*$gdb_prompt $" { }
    -re "$gdb_prompt $" { fail "did not return (integer test)" }
    timeout { fail "(timeout) did not return (integer test)" }
    }
    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-*-*"
    send_gdb "return 5.0\n"
    gdb_expect {
	-re "Make .* return now.*y or n. $" {
	    send_gdb "y\n"
	    exp_continue
	}
	-re ".*tmp3 = func3.*$gdb_prompt $" { }
	-re "$gdb_prompt $" { fail "did not return (double test)" }
	timeout { fail "(timeout) did not return (double test)" }
    }

    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-*-*"
    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
