# Copyright 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 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 $tracelevel then {
    strace $tracelevel
}

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.* file .*$hdrfile, line.*\\(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 "continue" \
    ".*Program exited normally.*" \
    "continue with 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.* file .*$hdrfile, line.*\\(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"
