# Copyright 2008-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 is part of the GDB testsuite.
#
# 'reverse-finish' used to have a bug where user breakpoints set at
# the functions entry would be ignored.  Make sure the bug doesn't
# reappear.

if ![supports_reverse] {
    return
}

standard_testfile finish-reverse.c

if { [prepare_for_testing $testfile.exp "$testfile" $srcfile] } {
    return -1
}

if ![runto_main] then {
    fail "Can't run to main"
    return 0
}

if [supports_process_record] {
    # Activate process record/replay
    gdb_test_no_output "record" "Turn on process record"
}

set breakloc [gdb_get_line_number "VOID FUNC" "$srcfile"]
gdb_test "break void_func" \
    "Breakpoint $decimal at .*/$srcfile, line $breakloc\." \
    "set breakpoint on void_func"
gdb_continue_to_breakpoint "void_func" ".*/$srcfile:$breakloc.*"

gdb_test "break \*void_func" \
    "Breakpoint $decimal at .*" \
    "set breakpoint at void_func's entry"

gdb_test "reverse-finish" \
    ".*Breakpoint .*, void_func.*" \
    "reverse-finish from void_func trips breakpoint at entry"

gdb_test "frame" "#0  void_func.*" "no spurious proceed after breakpoint stop"
