# Copyright 2004, 2007, 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 contains tests for breakpoints in C++.

if $tracelevel then {
        strace $tracelevel
        }

if { [skip_cplus_tests] } { continue }

#
# test running programs
#

set testfile "breakpoint"
set srcfile ${testfile}.cc
set binfile ${objdir}/${subdir}/${testfile}

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

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

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

proc test_breakpoint {name} {
    # Restart the program every time, so that a single failure doesn't
    # lead to a cascade.
    if ![runto_main] then {
	perror "couldn't run to main when testing ${name}"
	continue
    } else {
	gdb_breakpoint "${name}"
	gdb_test "continue" "Continuing.\r\n\r\nBreakpoint \[0-9\]*, ${name}.*" "continue to ${name}"
    }
}

test_breakpoint "C1::Nested::foo"

set bp_location1 [gdb_get_line_number "conditional breakpoint in method"]
set bp_location2 [gdb_get_line_number "conditional breakpoint in method 2"]
gdb_test "break $bp_location1 if i_==3" ".*Breakpoint.*" "conditional breakpoint in method"
gdb_test "break $bp_location2 if i_==3" ".*Breakpoint.*" "conditional breakpoint in method 2"
gdb_test "continue" ".*Breakpoint.*C1::foo.*" "continue to breakpoint"
gdb_test "print i_" "\\\$1 = 3" "check the member variable"
gdb_test "continue" ".*Breakpoint.*C1::bar.*" "continue to breakpoint"
gdb_test "print i_" "\\\$2 = 3" "check the member variable"


gdb_exit
return 0
