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


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

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