# Copyright 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 test verifies that setting breakpoint on line in template
# function will fire in all instantiations of that template.

if $tracelevel then {
    strace $tracelevel
}

if { [skip_cplus_tests] } { continue }

# On SPU this test fails because the executable exceeds local storage size.
if { [istarget "spu*-*-*"] } {
        return 0
}

set prms_id 0
set bug_id 0

set testfile "mb-templates"
set srcfile ${testfile}.cc
set binfile ${objdir}/${subdir}/${testfile}

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

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } {
     untested mb-templates.exp
     return -1
}

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

set bp_location [gdb_get_line_number "set breakpoint here"]

# Set a breakpoint with multiple locations
# and a condition.

gdb_test "break $srcfile:$bp_location if i==1" \
    "Breakpoint.*at.* file .*$srcfile, line.*\\(2 locations\\).*" \
    "initial condition: set breakpoint"

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

gdb_test "continue" \
    ".*Breakpoint.*foo<double> \\(i=1\\).*" \
    "initial condition: run to breakpoint 2"

# Set breakpoint with multiple locations.
# Separately set the condition.
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

gdb_test "break $srcfile:$bp_location" \
    "Breakpoint.*at.* file .*$srcfile, line.*\\(2 locations\\).*" \
    "separate condition: set breakpoint"

gdb_test "condition 1 i==1" "" \
    "separate condition: set condition"
    
gdb_run_cmd
gdb_expect {
    -re "Breakpoint \[0-9\]+,.*foo<int> \\(i=1\\).*$gdb_prompt $" {
	pass "separate condition: run to breakpoint"
    }
    -re "$gdb_prompt $" {
	fail "separate condition: run to breakpoint"
    }
    timeout {
	fail "separate condition: run to breakpoint (timeout)"
    }
}

gdb_test "continue" \
    ".*Breakpoint.*foo<double> \\(i=1\\).*" \
    "separate condition: run to breakpoint 2"

# Try disabling a single location. We also test
# that at least in simple cases, the enable/disable
# state of locations surive "run".
gdb_test "disable 1.1" "" "disabling location: disable"

gdb_run_cmd
gdb_expect {
    -re "Breakpoint \[0-9\]+,.*foo<double> \\(i=1\\).*$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)"
    }
}

# Try disabling entire breakpoint
gdb_test "enable 1.1" "" "disabling location: enable"


gdb_test "disable 1" "" "disable breakpoint: disable"

gdb_run_cmd
gdb_expect {
    -re "Program exited normally.*$gdb_prompt $" {
	pass "disable breakpoint: run to breakpoint"
    }
    -re "$gdb_prompt $" {
	fail "disable breakpoint: run to breakpoint"
    }
    timeout {
	fail "disable breakpoint: run to breakpoint (timeout)"
    }
}

# Make sure breakpoint can be set on a specific instantion.
delete_breakpoints
gdb_test "break 'void foo<int>(int)'" ".*" \
    "instantiation: set breakpoint"


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

gdb_test "continue" \
    ".*Breakpoint.*foo<int> \\(i=1\\).*" \
    "instantiation: run to breakpoint 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"]

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

gdb_test "break $srcfile:$bp_location" \
    "Breakpoint.*at.* file .*$srcfile, line.*\\(2 locations\\).*" \
    "set multi_line_foo breakpoint"
gdb_test "continue" \
    ".*Breakpoint.*multi_line_foo<int> \\(i=0\\).*" \
    "run to multi_line_foo breakpoint 2 <int>"
gdb_test "continue" \
    ".*Breakpoint.*multi_line_foo<double> \\(i=0\\).*" \
    "run to multi_line_foo breakpoint 2 <double>"
