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


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"

    gdb_test_multiple "return testval.${type}_testval" \
	"return from ${type}_func" {
	    -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"
	    }
	}
    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"

    gdb_test_multiple "return" "return from void_func" {
	-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"
	}
    }
    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"
    }
    if ![target_info exists gdb,skip_float_tests] {
	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
