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


standard_testfile .c

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     untested "failed to compile"
     return -1
}

set skip_float_test [gdb_skip_float_test]

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, ${type}"
}

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 skip_float_test

    if { ! [ runto_main ] } then {
	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 {!$skip_float_test} {
	return_1 "float"
	if { ! [istarget "m6811-*-*"] } then {
	    return_1 "double"
	}
    }
}

# Start with a fresh gdb.

clean_restart ${binfile}

set timeout 30
return2_tests
