# Copyright 2004-2021 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 { [skip_cplus_tests] } { continue }

#
# test running programs
#

standard_testfile .cc

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

if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug c++}]} {
    return -1
}

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}"
	return -code 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 in C1::foo"
gdb_test "print i_" "\\\$1 = 3" "check the member variable from within C1::foo"
gdb_test "continue" ".*Breakpoint.*C1::bar.*" "continue to breakpoint in C1::bar"
gdb_test "print i_" "\\\$2 = 3" "check the member variable from within C1::bar"


gdb_exit
return 0
