# Copyright 2000, 2004, 2007, 2008, 2009 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

# 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"
    send_gdb "finish\n"
    gdb_expect {
	-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"
	}
	-re ".*$gdb_prompt $" {
	    fail "finish from ${type}_func"
	}
	timeout {
	    fail "finish from ${type}_func (timeout)"
	}
    }
}

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"
    send_gdb "finish\n"
    # 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_expect {
	-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"
	}
	-re ".*$gdb_prompt $" {
	    fail "finish from void_func"
	}
	timeout {
	    fail "finish from void_func (timeout)"
	}
    }
}

# 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"
    finish_1 "float"
    finish_1 "double"
    finish_abbreviation "fin"
}

set timeout 30
finish_tests
