# 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.

# This test verifies that setting breakpoint on line in inline
# function will fire in all instantiations of that function.

if { [skip_cplus_tests] } { continue }


set testfile "mb-inline"
set hdrfile "${testfile}.h"
set srcfile1 "${testfile}1.cc"
set objfile1 "${testfile}1.o"
set srcfile2 "${testfile}2.cc"
set objfile2 "${testfile}2.o"
set binfile  "${objdir}/${subdir}/${testfile}"

if  { [gdb_compile "$srcdir/$subdir/$srcfile1" "$objdir/$subdir/$objfile1" object {debug c++}] != "" } {
     untested mb-inline.exp
     return -1
}

if  { [gdb_compile "$srcdir/$subdir/$srcfile2" "$objdir/$subdir/$objfile2" object {debug c++}] != "" } {
     untested mb-inline.exp
     return -1
}

if  { [gdb_compile "$objdir/$subdir/$objfile1 $objdir/$subdir/$objfile2" "${binfile}" executable {debug c++}] != "" } {
     untested mb-inline.exp
     return -1
}

if [get_compiler_info ${binfile} "c++"] {
    return -1
}

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

set bp_location [gdb_get_line_number "set breakpoint here" $hdrfile]

# Set a breakpoint with multiple locations.

gdb_test "break $hdrfile:$bp_location" \
    "Breakpoint.*at.*: $hdrfile:$bp_location. \\(2 locations\\).*" \
    "set breakpoint"

gdb_run_cmd
gdb_expect {
    -re "Breakpoint \[0-9\]+,.*foo \\(i=0\\).*$gdb_prompt $" {
	pass "run to breakpoint"
    }
    -re "$gdb_prompt $" {
	fail "run to breakpoint"
    }
    timeout {
	fail "run to breakpoint (timeout)"
    }
}

gdb_test "continue" \
    ".*Breakpoint.*foo \\(i=1\\).*" \
    "run to breakpoint 2"

# Try disabling a single location. We also test
# that at least in simple cases, the enable/disable
# state of locations survive "run".
# Early bug would disable 1.1 and enable 1.2 when program is run.
gdb_test_no_output "disable 1.2" "disabling location: disable"

gdb_run_cmd
gdb_expect {
    -re "Breakpoint \[0-9\]+,.*foo \\(i=0\\).*$gdb_prompt $" {
	pass "disabling location: run to breakpoint"
    }
    -re "$gdb_prompt $" {
	fail "disabling location: run to breakpoint"
    }
    timeout {
	fail "disabling location: run to breakpoint (timeout)"
    }
}

gdb_test_multiple "info break" "disabled breakpoint 1.2" {
    -re "1\.2.* n .* at .*$hdrfile:$bp_location.*$gdb_prompt $" {
	pass "disabled breakpoint 1.2"
    }
    -re "1\.2.* y .* at .*$hdrfile:$bp_location.*$gdb_prompt $" {
	# When inferior is restarted, breakpoint locations will be updated.
	# On uclinux, it is not guaranteed that new inferior is located the
	# same address as previous one, so status/state of breakpoint location
	# will loose.  The heuristic of GDB should be improved.
	setup_kfail gdb/12924 "*-*-uclinux*"
	fail "disabled breakpoint 1.2"
    }    
}

# Make sure we can set a breakpoint on a source statement that spans
# multiple lines.

delete_breakpoints

set bp_location [gdb_get_line_number "set multi-line breakpoint here" $hdrfile]

if { ![runto_main] } {
    fail "Can't run to main for multi_line_foo tests."
    return 0
}

gdb_test "break $hdrfile:$bp_location" \
    "Breakpoint.*at.*: $hdrfile:$bp_location. \\(2 locations\\).*" \
    "set multi_line_foo breakpoint"
gdb_test "continue" \
    ".*Breakpoint.*multi_line_foo \\(i=0\\).*" \
    "run to multi_line_foo breakpoint 4 afn"
gdb_test "continue" \
    ".*Breakpoint.*multi_line_foo \\(i=1\\).*" \
    "run to multi_line_foo breakpoint 4 bfn"
