# Copyright 2004-2013 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/>.

# Author: Paul N. Hilfinger (Hilfinger@gnat.com)

# Test that GDB cleans up properly after errors that result when a 
# breakpoint is reset. 

standard_testfile .c

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DVARIABLE=var1}] != "" } {
    untested chng-syms.exp
    return -1
}

set oldtimeout $timeout
set timeout 10
verbose "Timeout is now 10 seconds" 2

proc expect_to_stop_here { ident } {
    global gdb_prompt
    global decimal

    # the "at foo.c:36" output we get with -g.
    # the "in func" output we get without -g.
    gdb_expect {
	-re "Breakpoint \[0-9\]*, stop_here .*$gdb_prompt $" { 
	    return 1
	}
	-re "$gdb_prompt $" { 
	    fail "running to stop_here $ident"
	    return 0
	}
	timeout { 
	    fail "running to stop_here $ident (timeout)"
	    return 0
	}
    }
    return 1
}

clean_restart ${binfile}

gdb_test "break stop_here if (var1 == 42)" \
    "Breakpoint.*at.* file .*$srcfile, line.*" \
    "setting conditional breakpoint on function"
gdb_run_cmd

expect_to_stop_here "first time"
    
gdb_continue_to_end "breakpoint first time through"

# Now we recompile the executable, but without a variable named "var1", first
# waiting to insure that even on fast machines, the file modification times
# are distinct. This will force GDB to reload the file on the 
# next "run" command, causing an error when GDB tries to tries to reset 
# the breakpoint.

sleep 2
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DVARIABLE=var2}] != "" } {

# Complication: Since GDB generally holds an open file descriptor on the 
# executable at this point, there are some systems in which the 
# re-compilation will fail. In such cases, we'll consider the test 
# (vacuously) passed providing that re-running it succeeds as before.

    gdb_run_cmd
    expect_to_stop_here "after re-compile fails"
    gdb_continue_to_end "after re-compile fails"

} else {

    gdb_run_cmd
    gdb_expect {
	-re ".*$inferior_exited_re normally.*$gdb_prompt $" {
	    pass "running with invalidated bpt condition after executable changes" 
	}
	-re ".*Breakpoint .*,( 0x.* in)? (\[^ \]*)exit .*$gdb_prompt $" {
	    pass "running with invalidated bpt condition after executable changes" 
	}
	-re "$gdb_prompt $" { 
	    fail "running with invalidated bpt condition after executable changes" 
	}
	timeout {
	    fail "(timeout) running with invalidated bpt condition after executable changes" 
	}
    }

}

set timeout $oldtimeout
verbose "Timeout is now $timeout seconds" 2
return 0
