# 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.
set testfile "return2"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     untested finish.exp
     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"
}

# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

set timeout 30
finish_tests
