# Copyright 2000, 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)


# re-use the program from the "return2" test.
if { [prepare_for_testing finish.exp finish return2.c] } {
    return -1
}

proc finish_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 "finish" "finish from ${type}_func" {
	-re ".*Value returned is .* = 49 '1'\r\n$gdb_prompt $" {
	    if { $type == "char" } {
		pass "finish from char_func"
	    } else {
		fail "finish from ${type}_func"
	    }
	}
	-re ".*Value returned is .* = \[0123456789\]* '1'\r\n$gdb_prompt $" {
	    if { $type == "char" } {
		pass "finish from char_func (non-ASCII char set?)"
	    } else {
		fail "finish from ${type}_func"
	    }
	}
	-re ".*Value returned is .* = 1\r\n$gdb_prompt $" {
	    pass "finish from ${type}_func"
	}
    }
}

proc finish_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"
    # Some architectures will have one or more instructions after the
    # call instruction which still is part of the call sequence, so we
    # must be prepared for a "finish" to show us the void_func call
    # again as well as the statement after.
    gdb_test_multiple "finish" "finish from void_func" {
	-re ".*void_checkpoint.*$gdb_prompt $" {
	    pass "finish from void_func"
	}
	-re "0x\[0-9a-fA-F\]+ in main.*call to void_func.*$gdb_prompt $" {
	    pass "finish from void_func"
	}
    }
}

# A function that tests that the given ABBREV is a working abbreviation
# of the "finish" command.

proc finish_abbreviation { abbrev } {

    if { ! [ runto "int_func" ] } then {
        fail "running to int_func"
        return -1
    }

    gdb_test "$abbrev" \
             "Value returned is .* = 1" \
             "Testing the \"$abbrev\" abbreviation for \"finish\""
}

proc finish_tests { } {
    global gdb_prompt

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

    finish_void
    finish_1 "char"
    finish_1 "short"
    finish_1 "int"
    finish_1 "long"
    finish_1 "long_long"
    if ![target_info exists gdb,skip_float_tests] {
	finish_1 "float"
	finish_1 "double"
    }
    finish_abbreviation "fin"
}

set prev_timeout $timeout
set timeout 30
finish_tests
set timeout $prev_timeout
