# Copyright 2000, 2001, 2004, 2007, 2008 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 Michael Snyder (msnyder@redhat.com)

if $tracelevel then {
	strace $tracelevel
}

set prms_id 0
set bug_id 0

set testfile "return2"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     untested return2.exp
     return -1
}

proc return_1 { type } {
    global gdb_prompt

    gdb_test "break ${type}_func" "Breakpoint \[0123456789\].*" \
	    "set break on ${type}_func"
    gdb_test "continue" "Breakpoint.* ${type}_func.*" \
	    "continue to ${type}_func"
    send_gdb "return testval.${type}_testval\n"
    gdb_expect {
	-re "Make ${type}_func return now.*y or n. $" {
	    send_gdb "y\n"
	    exp_continue
	}
	-re ".*${type}_resultval *= ${type}_func.*$gdb_prompt $" {
	    send_gdb "step\n"
	    exp_continue
	}
	-re ".*${type}_checkpoint.*$gdb_prompt $" {
	    pass "return from ${type}_func"
	}
	-re ".*$gdb_prompt $" {
	    fail "return from ${type}_func"
	}
	timeout {
	    fail "return from ${type}_func (timeout)"
	}
    }
    gdb_test "print ${type}_resultval == testval.${type}_testval" ".* = 1" \
	    "${type} value returned successfully"
    gdb_test "print ${type}_resultval != ${type}_returnval" ".* = 1" \
	    "validate result value not equal to program return value"
}

proc return_void { } {
    global gdb_prompt

    gdb_test "break void_func" "Breakpoint \[0123456789\].*" \
	    "set break on void_func"
    gdb_test "continue" "Breakpoint.* void_func.*" \
	    "continue to void_func"
    send_gdb "return \n"
    gdb_expect {
	-re "Make void_func return now.*y or n. $" {
	    send_gdb "y\n"
	    exp_continue
	}
	-re ".*void_func.*call to void_func.*$gdb_prompt $" {
	    send_gdb "step\n"
	    exp_continue
	}
	-re ".*void_checkpoint.*$gdb_prompt $" {
	    pass "return from void_func"
	}
	-re ".*$gdb_prompt $" {
	    fail "return from void_func"
	}
	timeout {
	    fail "return from void_func (timeout)"
	}
    }
    gdb_test "print void_test == 0" ".* = 1" \
	    "void function returned successfully"
}

proc return2_tests { } {
    global gdb_prompt

    if { ! [ runto_main ] } then {
	untested return2.exp
	return -1
    }

    return_void
    return_1 "char"
    return_1 "short"
    return_1 "int"
    return_1 "long"
    if { ! [istarget "m6811-*-*"] && ![istarget "h8300*-*"] } then {
        return_1 "long_long"
    }
    return_1 "float"
    if { ! [istarget "m6811-*-*"] } then {
        return_1 "double"
    }
}

# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

set timeout 30
return2_tests
